Search K
Appearance
👍欢迎大家积极投稿交流👍
如果文档内容陈旧或者链接失效,请发现后及时同步,我将尽快修改
👇微信👇

Appearance
当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象(全局对象)。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。
函数有一个内部属性 [[scope]],当函数被创建时,会保存所有父变量对象到其中,可以理解 [[scope]] 就是所有父变量对象的层级链
提示
[[scope]] 并不代表完整的作用域链!
function foo() {
function bar() {
// ...code
}
}函数创建时各自的[[scope]]
foo.[[scope]] = [
globalContext.VO
]
bar.[[scope]] = [
fooContext.AO,
globalContext.VO
]当函数激活时,进入函数上下文,创建 VO/AO 后,就会将活动对象添加到作用链的前端。
这时候执行上下文的作用域链,命名为 Scope
Scope = [AO].concat([[Scope]])然后,作用域链创建完毕了。
var scope = 'global scope'
function checkscope() {
var scope2 = 'local scope'
return scope2
}
checkscope()执行过程
[[scope]]checkscope.[[scope]] = {
globalContext.VO
}ECstack = [checkscopeContext, globalcontext][[scope]]属性创建作用域链checkscopeContext = {
Scope:checkscope.[[scope]]
}加入形参、函数声明、变量声明checkscopeContext = {
AO:{
arguments:{
length:0
},
scope2:undefined
},
Scope:checkscope.[[scope]]
}checkscopeContext = {
AO: {
arguments: {
length: 0,
},
scope2: undefined,
},
Scope: [AO, [[scope]]],
}checkscopeContext = {
AO: {
arguments: {
length: 0,
},
scope2: 'local scope',
},
Scope: [AO, [[scope]]],
}ECstack = [globalcontext]