我听到两种说法:
定义函数时:
- 在
Professional Javascript for Web Developers, 3rd Edition
一书中,在Chapter 7: Function Expressions
闭包部分:
定义compare()时,其作用域链为创建,预加载全局变量对象,并保存到内部[[Scope]]属性。当调用函数时,将创建一个执行上下文,并通过复制函数的[[Scope]]属性中的对象。
据说作用域链是在定义函数id时创建的。
当函数被调用时:
- 在本文中:什么是执行上下文&用JavaScript堆叠?:
所以我们现在知道,每次调用函数时,都会创建一个新的执行上下文。然而,在JavaScript解释器中,对执行上下文的每次调用都有两个阶段:
- 创建阶段[当函数被调用时,但在它执行内部任何代码之前]:
- 创建变量、函数和参数
- 创建作用域链
- 确定";这个">
- 激活/代码执行阶段:
- 分配值、对函数的引用以及解释/执行代码
据说作用域链是在调用函数时创建的。
那么哪一个是对的呢?
函数有一个内部[[Scope]]属性,该属性设置为函数在中定义的范围,当函数定义时设置为。
然后,该作用域与执行函数时创建的新作用域一起成为作用域链的一部分。