//代码开始
var a = 10;
function outer() {
function inner() {
console.log(a);
console.log(b);
};
var b = 20;
return inner;
}
var innerFn = outer();
innerFn();
//代码结束
我的问题是:
在Closures中,函数会记住创建函数对象时的范围信息(在上面的例子中,在编译阶段),但此时的分配(对于a和b)并没有真正发生。那么,变量a和b的值是如何保留的。
如果上述陈述中出现问题,请纠正我。
答案 0 :(得分:2)
正如您在第一句中所说,闭包会记住范围信息。这包括对变量的引用,这些变量已经被声明(或者与函数同时声明)。这些变量的值是无关紧要的 - 当调用闭包时实际使用变量时会对它们进行求值。
您会注意到,在a
调用中创建闭包后覆盖outer()
时,它会在调用a
时为您提供innerFn()
的新值。从创建时起,闭包不记住值。
答案 1 :(得分:1)
我相信在这种情况下,闭包实际上是在您返回width: 248px;
时创建的,而不是在您定义函数inner
时创建的。在创建对函数的引用之前,闭包机制没有意义。