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]
输出2
? Fiddle of said problem :O
答案 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)
这与闭包无关。
您正在将对数组的引用传递给函数,并且该函数正在使用该引用来更改数组属性的值。
将对象(数组是对象)分配给变量时,您要将变量的值设置为对象的引用。您无法直接将对象操作为值;你只有参考资料。