当JS代码开始运行时,全局执行上下文被创建并位于执行堆栈的底部,以“容纳”全局变量对象和'this'
。
如果整个JS代码运行完后执行栈为空,并且没有全局执行上下文,我们如何仍然能够访问全局变量(例如,我正在运行一个带有 JS 代码的 html 文件,完成后我仍然可以通过 Chrome 控制台看到全局变量的值...)或how this
仍然指向全局对象(不应该有任何'this'
如果没有任何执行上下文!)?
我可以给自己的唯一解释是全局执行上下文永远不会离开执行堆栈;它一直在那里,直到我决定关闭浏览器窗口. 我说得对还是不对?
而且,在异步回调的情况下,当一个事件从事件队列中出来并进入JS引擎运行时,执行栈中到底发生了什么?回调的执行上下文是否位于该堆栈的底部,或者全局执行上下文是否仍然存在?
有一个类似的题目JavaScript 中初始全局执行上下文是否从调用堆栈中弹出? https://stackoverflow.com/questions/29879525/is-the-initial-global-execution-context-ever-popped-off-the-call-stack-in-javasc;但是,它并没有回答我的问题。
谢谢
当整个代码运行时,执行堆栈变空。
我们如何仍然能够访问全局变量?
即使没有执行任何代码全局词汇环境 http://www.ecma-international.org/ecma-262/5.1/#sec-10.2.3全局对象仍然存在。当您将一些代码输入 chrome 控制台时,代码正在被评估,一个新的全局执行上下文 http://www.ecma-international.org/ecma-262/5.1/#sec-10.3 is 正在创建并初始化 http://www.ecma-international.org/ecma-262/5.1/#sec-10.4.1.1其词汇和变量环境设置为全局环境并且this
绑定到全局对象。然后您的代码在此上下文中执行,并且执行堆栈再次变空。
how this
仍然指向全局对象?
每次使用全局代码初始化新的全局执行上下文时,this
绑定到全局对象。
如果是异步回调,当一个事件从事件队列中出来并进入JS引擎运行时,执行栈中到底发生了什么?
再次创建一个新的全局执行上下文并将其推送到空执行堆栈上。在MDN https://developer.mozilla.org/en/docs/Web/JavaScript/EventLoop#Queue这与中描述的术语略有不同ECMAScript 规范 http://www.ecma-international.org/ecma-262/5.1/:
当堆栈为空时,从队列中取出一条消息并进行处理。处理过程包括调用相关函数(从而创建初始堆栈帧)。当堆栈再次变空时,消息处理结束。 (MDN。并发模型和事件循环 https://developer.mozilla.org/en/docs/Web/JavaScript/EventLoop#Queue)
这里“堆栈帧”表示“执行上下文”,“初始堆栈帧”对应“全局执行上下文”。
回调的执行上下文是否位于该堆栈的底部,或者全局执行上下文是否仍然存在?
没有一个。堆栈是空的。并且仅当它为空时,才会从回调/事件队列中获取最旧的回调:
当没有正在运行的执行上下文并且执行上下文堆栈为空时,ECMAScript 实现会从作业队列中删除第一个 PendingJob,并使用其中包含的信息创建执行上下文并开始执行关联的 Job 抽象操作。ECMAScript 6.0 规范 http://www.ecma-international.org/ecma-262/6.0/#sec-jobs-and-job-queues
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)