巡山小妖精 2022-05-04 13:51:27
函数被创建时,保存作用域链到函数的内部属性[[scope]]这一步的一点个人理解,不知是否正确
最近才看到这个博客,好多概念有了全新的认识,感谢博主的分享。
有几个问题不知道自己的理解是否正确,以代码1举例说明
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f();
}
checkscope();
函数的创建和执行的关系。
全局中创建的函数是在全局上下文执行的时候创建的;函数a内部创建的函数b是在函数a执行的时候创建的。
在代码1中:
checkscope函数是在全局上下文执行的时候创建的,f函数是在checkscope函数执行时被创建的。
疑问1:如果没有最后一句checkscope();执行checkscope函数,f函数就不会被创建,那么f函数的[[scope]]以及fContext均不会生成?函数创建时[[scope]]属性的生成。
疑问2:函数创建时[[scope]]属性是否是此时执行上下文栈中最上层的执行上下文对象的Scope的引用?
在代码1中:
- checkscope函数创建时是全局上下文执行时,此时
ECStack = [
globalContext
];
globalContext = {
VO: [global],
Scope: [globalContext.VO],
this: globalContext.VO
}
checkscope.[[scope]] = [
globalContext.VO
];
checkscope.[[scope]] 就是ECStack中最上层上下文globalContext.Scope的引用
- f函数创建时是checkscope函数上下文执行时,此时
ECStack = [
checkscopeContext,
globalContext
];
checkscopeContext = {
AO: {
arguments: {
length: 0
},
scope: undefined,
f: reference to function f(){}
},
Scope: [AO, globalContext.VO],
this: undefined
}
f.[[scope]] = [
checkscopeContext.AO
globalContext.VO
];
f.[[scope]] 就是此时ECStack中最上层上下文checkscopeContext.Scope的引用
在代码1中我的这个想法貌似能说通。
以上两个疑问还请聚聚们赐教
- 共 1 页
- 1
第 30 题:请把俩个数组 [A1, A2, B1, B2, C1, C2, D1, D2] 和 [A, B, C, D],合并为 [A1, A2, A, B1, B2, B, C1, C2, C, D1, D2, D]