2013-02-23 2 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 отдельно от родителей 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

Есть несколько способов сделать это. Один из них - итерация с помощью метода, который использует замыкание в качестве обратного вызова.

Смежные вопросы