【发布时间】:2015-01-23 22:41:20
【问题描述】:
我知道如何实现闭包,但我无法理解为什么会发生闭包。例如:
function foo(){
var a = 4;
return function innerFoo(){
alert(a);
};
};
var bar = foo();
bar(); // alerts 4
当我看到上面的代码时,我知道会发生什么,但是当我尝试从逻辑上遵循它时,它没有任何意义。我认为我对执行上下文及其作用域链的理解是错误的。
这就是我期望程序运行的方式:
function foo(){
var a = 4;
return function innerFoo(){
alert(a);
};
};
var bar = foo(); // function foo() is executed, creating a foo execution context(EC)
// fooEC = {scopeChain: [fooEV.VO, globalEC.VO],
// VO: {innerFoo: pointer to innerFoo(),
// a: 4}};
// So, the pointer to innerFoo() is returned to bar
// fooEC is exited
bar(); // bar points to code in innerFoo(), creates a innerFoo execution context
// innerFooEC = {scopeChain: [innerFoo.VO, globalEC.VO],
// VO: { }};
// interpreter searches innerFooEC.VO for variable "a", none found, looks
// down the scope chain at the global variable object,
// globalEC = {scopeChain: [globalEC.VO],
// VO: {foo: pointer to foo(),
// bar: pointer to innerFoo()}};
// a is undefined
我哪里做错了?
【问题讨论】:
-
我认为这里的关键是理解词法范围和闭包。
-
innerFooEC的scopeChain将是[innerFooEC.VO].concat(fooEC.scopeChain);或[innerFooEC.VO, fooEC.VO, globalEC.VO] -
bar指向innerFoo函数对象(不仅仅是它的代码),并且该函数对象有一个指向其父环境的指针:fooEC。当函数被调用时,它将用于作用域链——它不是跟随innerFoo.VO的全局对象
标签: javascript closures