Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как разомкнуть замыкание? (https://javascript.ru/forum/misc/47238-kak-razomknut-zamykanie.html)

FreeVice 15.05.2014 11:47

Как разомкнуть замыкание?
 
вот этот код возвращает 2, 2, 2

как сделать, чтобы он возвращал 0, 1, 2? я уже стал создавать переменную и присваивать в нее i через parseInt(i.toString()), и потом класть в алерт - все-равно не помогает
var data = [];

for(var i = 0; i < 3; i++) {
    var b = parseInt(i.toString());
    var curr = function() { alert(b); };
    data.push(curr);
}

for(var j = 0; j < 3; j++) {
    data[j]();
}


http://jsfiddle.net/ateregulov/kdZ9h/

jsnb 15.05.2014 11:56

Классика жанра.
var data = [];

for(var i = 0; i < 3; i++) {
    var curr = (function(i) { return function() { alert(i); } })(i);
    data.push(curr);
}

for(var j = 0; j < 3; j++) {
    data[j]();
}


Ну, а вообще желательно ознакомиться с этим:
http://learn.javascript.ru/closures
http://learn.javascript.ru/closures-usage

Aetae 15.05.2014 12:02

Название темы - зачёт.)

melky 15.05.2014 12:10

Цитата:

Сообщение от Aetae (Сообщение 311924)
Название темы - зачёт.)

тоже порадовало)

FreeVice 15.05.2014 17:40

Цитата:

Сообщение от jsnb (Сообщение 311922)
Классика жанра.
var data = [];

for(var i = 0; i < 3; i++) {
    var curr = (function(i) { return function() { alert(i); } })(i);
    data.push(curr);
}

for(var j = 0; j < 3; j++) {
    data[j]();
}


Ну, а вообще желательно ознакомиться с этим:
http://learn.javascript.ru/closures
http://learn.javascript.ru/closures-usage

ох ты блин, а я проще сделал :-Р

добавил всего один new и вторая функция не нужна!!!!


Часовой пояс GMT +3, время: 11:13.