javascript事件循环问题

javascript事件循环问题,javascript,browser,node.js,this,event-loop,Javascript,Browser,Node.js,This,Event Loop,我想知道事件循环在javascript中是如何工作的, 我正在使用node.js,但我想同样的问题也适用于浏览器 我有一些异步调用(比如setTimeout或$.ajax或fs.readFile) 一段时间后,事件循环执行回调 现在,当执行回调时,幕后会发生什么? 它是否恢复了调用异步内容时使用的堆栈 实际上,回调所处的上下文/背景是什么? 它是如何工作的 编辑:谢谢,我明白了。。 还有一个问题,事件循环如何“记住”回调的作用域?JavaScript使用函数作用域,作用域规则在所有JS环境中都是

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

我有一些异步调用(比如
setTimeout
$.ajax
fs.readFile
) 一段时间后,事件循环执行
回调

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

实际上,回调所处的上下文/背景是什么? 它是如何工作的

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

JavaScript使用函数作用域,作用域规则在所有JS环境中都是相同的。正如Nican提到的,理解闭包对于了解当前范围内的可用内容非常重要

基本上,函数“记住”定义它的环境。因此,如果在回调中使用内联匿名函数,它将可以访问其父函数可用的所有变量以及作为参数传递给它的任何内容

关于JavaScript中的闭包和作用域的一些参考资料:


斯托扬·斯特凡诺夫(Stoyan Stefanov)的书《面向对象的JavaScript》在解释JavaScript中的作用域以及函数的工作原理方面做了大量工作(参见第4章)。我向所有认真研究JS编程的人推荐这本书。

Philip Roberts创建了一个很好的工具,它可以帮助您理解javascript的调用堆栈/事件和循环/回调是如何相互作用的。在编辑器中编写一些javascript代码并试着运行它。

否。javascript不会恢复堆栈阅读闭包是如何工作的。这可能有用:()。对于相关的jQuery函数:()事件循环如何“记住”回调的作用域?@browsingLoops:回调记住作用域本身。函数定义后,该函数继承外部函数(如果存在)的范围链。看一看这张照片。对于函数声明,它说:“返回13.2中指定的创建新函数对象的结果,其中参数由
FormalParameterListopt
指定,主体由
FunctionBody
指定。将运行执行上下文的
VariableEnvironment
作为
范围传递。”