javascript闭包无法使用数组属性?

时间:2014-05-21 21:06:43

标签: javascript closures

 var a = [false, 3];
 console.info('a: '+a);
     (function(item){
            var jamie = item;
        jamie [1]--;
         console.info('jamie:  '+jamie);
     })(a);
 console.info('a: '+a);

在我看来a[1]在这个javascript中总是等于3。

当不使用数组时,它按预期工作:

 var a = 3;
 console.info('b: '+a);
     (function(item){
            var jamie = item;
        jamie--;
         console.info('jamie b:  '+jamie);
     })(a);

console.info('b:'+ a);

为什么运行此JS后a[1]输出2Fiddle of said problem :O

2 个答案:

答案 0 :(得分:3)

因为您提供了对象的引用而没有按值传递它;

如果你想克隆对象,这里有一个有用的功能:

function clone(obj) {
    if (null == obj || "object" != typeof obj) return obj;
    var copy = obj.constructor();
    for (var attr in obj) {
        if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
    }
    return copy;
}

var a = [false, 3];
console.info(a); // [false, 3];
    (function(item){
        var jamie = clone(item);
        jamie [1]--;
        console.log(jamie); // [false, 2];
    })(a);
console.info(a); // [false, 3];

答案 1 :(得分:1)

这与闭包无关。

您正在将对数组的引用传递给函数,并且该函数正在使用该引用来更改数组属性的值。

将对象(数组是对象)分配给变量时,您要将变量的值设置为对象的引用。您无法直接将对象操作为值;你只有参考资料。