2017-03-01 57 views
2

//代码开始瓶盖 - 编译VS解读阶段的JavaScript

var a = 10; 
function outer() { 
    function inner() { 
     console.log(a); 
     console.log(b); 
    }; 
    var b = 20; 
    return inner; 
} 
var innerFn = outer(); 
innerFn(); 

//代码结束

我的问题是:

在闭包,函数从时间记忆范围的信息函数对象被创建(在上面的情况下,在编译阶段),但当时的分配(对于a和b)并没有真正发生。那么,如何保留变量a和b的值。

如果上述说明中出现错误,请纠正我的错误。

+0

a)一个闭包在一个变量*范围*上关闭,不超过值b)没有“编译阶段” – Bergi

回答

2

正如您在第一句中所说的那样,封盖会记住范围信息。这包括对变量的引用,这些变量已经被声明(或者与函数同时被声明)。这些变量具有什么值并不重要 - 当调用闭包时实际使用变量时会对它们进行评估。

你会发现,当你已经创造了outer()通话结束后覆盖a,它会调用innerFn()时给你a新值。闭合做而不是记住从他们的创建时间。

+0

谢谢。这非常有帮助。 –

+0

@ShashankShekhar很高兴帮助:-)你可能想[接受答案](http://stackoverflow.com/help/someone-answers)。 – Bergi

+0

对不起,我有点新的论坛。公认。 –

1

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