所有属性都设置为最后一个循环迭代值[为什么?]

时间:2013-09-15 13:39:18

标签: javascript jquery arrays loops object

示例代码:

var functions = {
 testFunction: function(){
  console.log('test');
 }      
};
var functionsClones = [];
for(i in [1,2,3]){
 var functionsClone = $.extend({}, functions);
 functionsClone.testFunction.i = i;
 functionsClones.push(functionsClone);
}

$ .extend 是jQuery函数,它允许克隆对象而不是复制对象。

现在让我们打印设置属性:

$.each(functionsClones, function(key, functionsClone){
 console.log(functionsClone.testFunction.i);
});

它输出3次'2'而不是0,1,2。这段代码出了什么问题?

1 个答案:

答案 0 :(得分:2)

因为您在同一个i对象(恰好是一个函数)上设置了testFunction 。你不是在循环的每次迭代中都创建一个新函数。

因此,在循环结束时,函数testFunction对象保存它接收的最后一个值。

因为JavaScript只提供对象的引用,而不是对象本身,所以不会复制。

要制作单独的副本,您需要在循环中创建该函数。