function testFn() {
var localVar = 10;
function innerFn(innerParam) {
alert(innerParam + localVar);
}
return innerFn;
}
var someFn = testFn();
someFn(20); // 30
someFn(20);是如何将 20link 到 innerParam 的?
#5 楼 @linjunhalida “localVar 被放在 testFn 的堆中”这样说也不太对。大多数人会解释为“testFn() 的作用链保存了上下文环境”。不知道说的对不对,求进一步详解
Javascript 的执行环境分为三个 global, function 和 eval code。
// global context
function testFn() {
// context1
var localVar = 10;
function innerFn(innerParam) {
// context2
alert(innerParam + localVar);
}
return innerFn;
}
var someFn = testFn();
someFn(20); // 30
程序按执行顺序将 执行上下文(栈帧)压入栈 压栈顺序 global -> context1 -> context2 弹栈顺序 context2 -> context1
Javascript 提供了一种机制可以让 context2 访问到 context1,我没找着相关虚拟机实现。 类似 Java 的内部类是在编译时给 内部类一个隐含成员指到外部实例。Javascript 就是通过作用域链查找到上一个执行上下文。
innerFn 在执行前 testFn 是不会出栈的,所以可以在 innerFn 回溯到 testFn 的上下文。
testFn() = innerFn;//innerFn 保存 testFn 作用域,localVar 在其中 someFn(20) = innerFn(20);