JavaScript事件循环问题

11

我想知道JavaScript中的事件循环是如何工作的, 我正在使用Node.js,但我认为同样的问题也适用于浏览器。

我有一些异步调用(比如setTimeout$.ajaxfs.readFile),然后一段时间后事件循环执行了callback

现在当callback被执行时,在幕后会发生什么? 它是否恢复了调用异步操作时使用的堆栈?

实际上,回调函数所在的上下文/this是什么? 它是如何工作的?

编辑:谢谢,我明白了。 还有一个问题,事件循环如何“记住”回调函数的作用域?


1
不,JavaScript不会重新启动栈。需要了解闭包的工作原理。 - Nican
1
这可能会有用:(https://dev59.com/hXVC5IYBdhLWcg3wykaj)。还有一个相关的jQuery函数:(http://api.jquery.com/jQuery.proxy/)。 - Doug Owings
2个回答

2
JavaScript使用函数作用域,所有JS环境中的作用域规则都是相同的。正如Nican所提到的,理解闭包对于知道当前范围内可用的内容非常重要。
基本上,一个函数“记住”了它被定义的环境。因此,如果您为回调使用内联匿名函数,它将可以访问其父函数中可用的所有变量以及传递给它的任何参数。
关于JavaScript中闭包和作用域的一些资源: Stoyan Stefanov的书《面向对象的JavaScript》非常好地解释了JavaScript中的作用域以及函数的词法作用域是如何工作的(见第4章)。我会推荐这本书给任何认真学习JS编程的人。

事件循环如何“记住”回调的作用域? - user815070
1
@browsingLoops:回调函数会记住其自身的作用域。在函数定义时,如果存在外部函数,则该函数继承外部函数的作用域链。请查看规范。对于函数声明,它说:“按照13.2中指定的参数创建一个新的Function对象,并按照FunctionBody指定的内容进行设置。将正在运行的执行上下文的VariableEnvironment作为Scope传递。” - Felix Kling

0

有一个很好的工具叫做Javascript Loupe,由Philip Roberts创建,它可以帮助您了解JavaScript的调用堆栈/事件和循环/回调之间的交互。在编辑器中编写一些JavaScript代码并尝试运行它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接