参考文章:
[译] 理解 JavaScript 中的执行上下文和执行栈
彻底明白作用域、执行上下文
JavaScript 执行上下文和执行栈
深入理解 JavaScript 作用域和作用域链
谈谈 JavaScript 的作用域
经常混淆作用域和执行上下文的概念,误认为它们是相同的概念,但事实并非如此。
JavaScript 属于解释型语言,JavaScript 的执行分为:解释和执行两个阶段。
-
解释阶段:
- 词法分析
- 语法分析
- 作用域规则确定
-
执行阶段:
- 创建执行上下文
- 执行函数代码
- 垃圾回收
JavaScript 解释阶段便会确定作用域规则,因此作用域在函数定义时就已经确定了,而不是在函数调用时确定,但是执行上下文是函数执行之前创建的。执行上下文最明显的就是 this 的指向是执行时确定的。而作用域访问的变量是编写代码的结构确定的。
作用域和执行上下文之间最大的区别是:
执行上下文在运行时确定,随时可能改变;作用域在定义时就确定,并且不会改变。
总结:
一个作用域下
可能包含若干个上下文环境;(全局作用域下有若干个函数被调用)
有可能从来没有过上下文环境;(函数从来就没有被调用过)
有可能有过(现在函数被调用完毕后,上下文环境被销毁了);
有可能同时存在一个或多个(闭包)。
同一个作用域下,不同的调用会产生不同的执行上下文环境,继而产生不同的变量的值。
网友评论