Javascript Closures - 无法在IIFE函数中保存“count”的副本

时间:2017-09-12 07:24:08

标签: javascript function scope closures iife

所以我有一个名为count的全局var,它在两个函数声明之间从0变为4(参见myFuncs数组)。

我想创建一个闭包,并为第一个函数保存一个0的副本,在第二个函数中保存4个副本。

不知何故,即使我使用IIFE(立即调用函数表达式)创建新的词法范围并使用(作为j)保存计数副本,它们仍然指向count = 4,因此当函数是执行时,第一个和第二个功能都打印出“我的值:4”两次我预期:

“我的价值:0” “我的价值:4”

var myFuncs = {};

var count = 0;

myFuncs[0] = function(){
    (function(){
        var j = count; //create a closure over the count value and save it inside the IIFE scope
        console.log("My value: " + j); //expecting j to be 0
    })();
}

count = 4;  //Update value inbetween two function declarations

//same as above but the j here should be 4
myFuncs[1] = function(){
    (function(){
        var j = count; //create a closure over the count value and save it inside the IIFE scope
        console.log("My value: " + j);
    })();
}

myFuncs[0](); //My value: 4
myFuncs[1](); //My value: 4

1 个答案:

答案 0 :(得分:1)

您实际上并没有使用该变量创建闭包,因为您在函数中引用它。它需要传入,并且需要使用传递的值。

        myFuncs[0] = function(j){
            return function(){
                console.log("My value: " + j);
            };
        }(count);