JavaScript了解某些闭包行为

时间:2012-02-15 06:34:22

标签: javascript node.js closures

以下代码的输出为12 12。

var omg = function(){

        var space = {q:12} ;

        var sq = [];

        sq[0] = function(){
                console.log(space.q);
                space.q = 14;
        };

        sq[1] = function(){
                console.log(space.q);
        };



        return sq;

};

omg()[0]();
omg()[1]();
~                           

为什么输出不是12 14?!?

3 个答案:

答案 0 :(得分:4)

每个omg()调用都会返回一个新函数。因此,omg()[0]()调用会更改该特定实例的q的本地值。我想如果你这样做了:

var a = omg()
a[0](); 
a[1](); 

你会得到预期的输出。

答案 1 :(得分:3)

每个omg()都会生成一个单独的闭包,其中包含一个单独的space对象。

要获得预期的行为,您需要拨打omg() 一次并使用相同的变量调用其中的两个函数:

var arr = omg();
arr[0]();
arr[1]();

答案 2 :(得分:1)

您执行omg()两次,因此您可以使用单独的space对象获得两个不同的闭包。