相关疑难解决方法(0)

浏览器Javascript堆栈大小限制

我在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函数联系起来,如果它可以在堆栈中为堆栈跟踪提供堆栈中的函数链提出错误.

javascript browser stack limit

64
推荐指数
2
解决办法
4万
查看次数

为什么无限递归异步函数不会导致堆栈溢出?

我在想,当异步函数递归调用自己无限时会发生什么。我的想法是,它不会导致堆栈溢出。但是我无法确切指出为什么会这样。

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 async-await

10
推荐指数
2
解决办法
259
查看次数

如果是 Web API,为什么 console.log 似乎没有进入事件队列?

大多数解释浏览器中 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)

javascript v8 event-loop ecmascript-6

6
推荐指数
0
解决办法
1545
查看次数

Javascript:settimeout 递归无限堆栈增加?

我的目标是使用 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 recursion slideshow

3
推荐指数
1
解决办法
361
查看次数

请指出我学习异步Javascript过程中的错误

我是 Javascript 和异步编程的新手,有些事情让我感到困惑,请指出我学习中的错误。

  • 异步函数的回调被放入消息队列中并通过事件循环执行。
  • 异步执行是非阻塞的,通过事件循环完成。
  • 像这样的函数setTimeout是异步的。
  • 异步函数是阻塞的,只有它们的回调是非阻塞的。

以上如有错误,请指出。

javascript asynchronous node.js

2
推荐指数
1
解决办法
531
查看次数

将临时变量分配给变量时异步函数的不同行为

为什么以下情况会出现不同的结果?第一个示例工作正常,返回一个包含三个元素的数组["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.

javascript arrays variables promise async-await

1
推荐指数
1
解决办法
821
查看次数

JavaScript 中的“事件循环”和“事件队列”是否相同?

我是 JavaScript 新手,想知道“JS”如何处理异步操作。我开始知道它是在“事件循环”和“事件队列”的帮助下完成的,但我不知道其中的区别。有人可以帮我吗。

的一个例子asynchronous operations可以是:

function alpha(){
  setTimeout(() => alert("hi"), 3000);
};

alpha();
Run Code Online (Sandbox Code Playgroud)

html javascript css ecmascript-6

0
推荐指数
1
解决办法
756
查看次数