示例代码:
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。这段代码有什么问题?
最佳答案
因为您在同一个 testFunction
对象上设置 i
(它恰好是一个函数)。您不会在循环的每次迭代中创建新函数。
因此,在循环结束时,函数 testFunction
对象保存它收到的最后一个值。
由于 JavaScript 只提供对对象的引用,而不提供对象本身,因此不会创建副本。
要制作单独的副本,您需要在循环中创建该函数。
关于javascript - 所有属性都设置为最后一个循环迭代值[为什么?],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18813049/