闭包 - 编译与解释阶段javascript

时间:2017-03-01 21:05:04

标签: javascript closures

//代码开始

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的值是如何保留的。

如果上述陈述中出现问题,请纠正我。

2 个答案:

答案 0 :(得分:2)

正如您在第一句中所说,闭包会记住范围信息。这包括对变量的引用,这些变量已经被声明(或者与函数同时声明)。这些变量的值是无关紧要的 - 当调用闭包时实际使用变量时会对它们进行求值。

您会注意到,在a调用中创建闭包后覆盖outer()时,它会在调用a时为您提供innerFn()的新值。从创建时起,闭包记住

答案 1 :(得分:1)

我相信在这种情况下,闭包实际上是在您返回width: 248px;时创建的,而不是在您定义函数inner时创建的。在创建对函数的引用之前,闭包机制没有意义。