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

标签 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。这段代码有什么问题?

最佳答案

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

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

由于 JavaScript 只提供对对象的引用,而不提供对象本身,因此不会创建副本。

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

关于javascript - 所有属性都设置为最后一个循环迭代值[为什么?],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18813049/

相关文章:

javascript - 单击按钮时为 div 选择不同的背景颜色

python - pytorch - torch.gather 的倒数

java - 如何从从 C# 接收到的字节数组加载图像?安卓应用

javascript:强制没有框架和 POST?

javascript - 将列表项随机分配给列

javascript - 在动态生成的 DOM 上取消初始化/重新初始化 tinyMCE

c++ - 带维度的数组参数

javascript - 如何在函数中将值作为参数返回

javascript - 将值和控制从 javascript 传递到 servlet

javascript - 在 JavaScript 事件中添加最小值和最大值