2013-02-23 84 views
3

我有类似于您在下面看到的情况。在返回第一个异步回调之前,变量id设置为'03'。有没有办法像Objective-C中的块那样在变量周围进行深度复制或“关闭”?有最佳做法吗?如何在javascript中进行深层复制?

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 

回答

1

如果您对循环使用.forEach(),而不是你关闭免费:

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

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

或者,如果你没有ES5-主义一样.forEach(),您可以使用自执行功能关闭状态。下面我们就从父i创建innerly范围的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) 
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); 
} 
0

如果您使用的是jQuery。这很容易

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

这就是你所要做的。

2

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

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