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

4 回答 4

2

有几种方法可以做到这一点。一种是使用一个将闭包用作回调的方法进行迭代。

ids.forEach(function (elem) {
    collection.find({id: ids} function () {
        console.log(elem);
    });
});
于 2013-02-23T05:05:31.063 回答
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); 
}
于 2013-02-23T05:00:01.450 回答
1

如果您使用 .forEach() 而不是 for 循环,您将免费获得闭包:

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

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

或者,如果您没有像 .forEach() 这样的 ES5 主义,您可以使用自执行函数来关闭状态。在这里,我们将创建一个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)
于 2013-02-23T05:03:52.770 回答
0

如果您使用的是 jQuery。这简单

var newObject = jQuery.extend(true, {}, oldObject);

这就是你所要做的。

于 2013-02-23T05:03:13.440 回答