如何在Javascript中进行深度复制?

3

我有一个和下面类似的情况。变量id在第一个异步回调返回前被设置为'03'。是否有一种方法可以深复制或“封闭”该变量,就像在Objective-C中使用块那样?是否有最佳实践?

var ids = ['01', '02', '03'];

for(var i=0, i < ids.length; i++){
  var id = ids[i];
  collection.find({id: ids} function () {
    console.log(id);
  });
}

控制台输出如下:

03
03
03
4个回答

2

有几种方法可以实现这个功能。其中一种是使用闭包作为回调函数进行迭代。

ids.forEach(function (elem) {
    collection.find({id: ids} function () {
        console.log(elem);
    });
});

1
创建一个闭包会创建一个私有作用域,这将实现你所期望的功能。
var ids = ['01', '02', '03'];

for(var i=0, i < ids.length; i++){
  var id = ids[i];
  (function(index){ 
      collection.find({id: ids}, function () {
          console.log(index);
      });
  })(id); 
}

1
如果您使用 .forEach() 而不是 for 循环,则可以免费获得闭包:
var ids = ['01', '02', '03'];

ids.forEach(function (id) {
  collection.find({id: ids} function () {
    console.log(id);
  });
});

如果您没有ES5的功能,比如.forEach(),您可以使用自执行函数来关闭状态。在这里,我们将创建一个与父级i分开的内部作用域的i

var ids = ['01', '02', '03'];

for (var i=0; i < ids.length; i++) (function (i) {
    var id = ids[i];
    collection.find({id: ids} function () {
        console.log(id);
    });
})(i)

0
如果你正在使用jQuery。这很容易 var newObject = jQuery.extend(true, {}, oldObject); 这就是你所要做的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接