我在IE浏览器中特别得到了一些客户端Javascript堆栈溢出问题,这发生在第三方库中,它进行了一些函数调用,并且由于某种原因它们偶尔会因为它的低堆栈限制而在IE中制动.
然后我编写了一个小测试HTML来测试一些浏览器的堆栈大小限制,发现IE8实际上有一个小的堆栈限制,如果与运行在Windows 7操作系统,8Gb RAM的笔记本电脑上的FF 7或Chrome 14相比:
<html>
<body>
<!-- begin Script: -->
<script type="text/javascript">
function doSomething(){
var i = 3200;
doSomethingElse(i);
}
function doSomethingElse(i){
if (i == 0) return -1;
doSomethingElse(i-1);
}
doSomething();
</script>
<!-- END OF PAGE -->
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
当值大约为3200时,IE引发堆栈溢出,如果与IE相比,Firefox和Chrome可以处理非常深的递归.
我想知道是否有办法将堆栈溢出异常与在IE或任何其他浏览器中运行时引发它的Javascript函数联系起来,如果它可以在堆栈中为堆栈跟踪提供堆栈中的函数链提出错误.
我在想,当异步函数递归调用自己无限时会发生什么。我的想法是,它不会导致堆栈溢出。但是我无法确切指出为什么会这样。
const foo = async () => {
const txt = await Promise.resolve("foo");
console.log(txt);
foo();
}
foo();
Run Code Online (Sandbox Code Playgroud)
上面的代码无限打印“ foo”,而不会溢出堆栈。
我的想法是,代码在概念上与以下代码类似,它不会导致堆栈溢出,因为递归调用foo()位于回调内部,而对的原始调用foo()将在此之前返回。
const bar = () => {
console.log("foo");
foo();
}
const foo = () => {
setImmediate(bar);
}
foo();
Run Code Online (Sandbox Code Playgroud)
我正在寻找有关异步功能情况下的确切答案。
大多数解释浏览器中 JavaScript 并发模型的示例都列出了三个部分:调用堆栈、Web API 和事件队列。通常描述的正常过程是 Web API 不由核心 ECMAScript 处理,而是由 Web API 处理;此时它们会移入事件队列等待,直到调用堆栈为空才能执行。setTimeout通常用作此过程的示例。
我的问题是:
1.)既然console.log是一个Web API,为什么它不进入setTimeout后面的事件队列?(它是否进入事件队列)?
2.) 如果它不进入事件队列,那么什么决定了哪些 API 从调用堆栈中拉出以经历事件循环过程?是不是只有那些等待某些东西并且有回调的API?
setTimeout(function(){
doSomething();
},0);
console.log('Hello World!');
Run Code Online (Sandbox Code Playgroud) 我的目标是使用 HTML/CSS/JS 制作背景图片的幻灯片。我发现的许多解决方案都促进了这样的事情:
my_recursion();
function my_recursion () {
// cycle the Background image ...
setTimeout(my_recursion, 3000);
}
Run Code Online (Sandbox Code Playgroud)
我认为这是不好的风格是错误的吗?我希望在例如周期 1000 时,所有其他 999 个 my_recursion 实例仍然打开/在堆栈上?这不会创建消耗越来越多内存的无限堆栈吗?
或者是否涉及某种智能,例如“如果一个函数在最后调用自己,则第 (n-1) 个函数将被销毁,包括在其中分配的所有变量”?
我是 Javascript 和异步编程的新手,有些事情让我感到困惑,请指出我学习中的错误。
setTimeout是异步的。以上如有错误,请指出。
为什么以下情况会出现不同的结果?第一个示例工作正常,返回一个包含三个元素的数组["qwe", "rty", "asd"]。第二个示例仅返回最后一个元素["asd"]。请解释一下它是如何工作的?为什么会发生这种行为?
在第一个示例中,通过中间变量进行工作awaitResult。
class XXX {
constructor() {
this.storage = {1: ['qwe'], 2: ['rty'], 3: ['asd']}
}
async getValue(key) {
return this.storage[key];
}
async logValues() {
let keys = [1, 2, 3]
let values = []
// ----- First version -----
await Promise.all(
keys.map(
async key => {
let awaitResult = await this.getValue(key)
values = values.concat(awaitResult)
}
)
);
console.log(values)
}
}
let xxx = new XXX()
xxx.logValues()Run Code Online (Sandbox Code Playgroud)
在第二个例子中,没有awaitResult.
class XXX …Run Code Online (Sandbox Code Playgroud)我是 JavaScript 新手,想知道“JS”如何处理异步操作。我开始知道它是在“事件循环”和“事件队列”的帮助下完成的,但我不知道其中的区别。有人可以帮我吗。
的一个例子asynchronous operations可以是:
function alpha(){
setTimeout(() => alert("hi"), 3000);
};
alpha();Run Code Online (Sandbox Code Playgroud)
javascript ×7
async-await ×2
ecmascript-6 ×2
arrays ×1
asynchronous ×1
browser ×1
css ×1
event-loop ×1
html ×1
limit ×1
node.js ×1
promise ×1
recursion ×1
slideshow ×1
stack ×1
v8 ×1
variables ×1