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

それにはいくつかの方法があります。1 つは、クロージャーをコールバックとして使用するメソッドを反復処理することです。

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

for ループの代わりに .forEach() を使用すると、無料でクロージャーを取得できます。

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

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

または、.forEach() のような ES5-isms がない場合は、自己実行関数を使用して状態を閉じることができます。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 に答える