var b = new Array(); for (var x=0; x<4; x++) { b[x] = function() { alert(x); }; } b[2]();
Pokud laskavý čtenář předpokládá, že volání vypíše "2", je stejně naivní jako já. Kód vypisuje pro všechny volání "4".
Problém spočívá v tom, že při volání volání uzávěru se (pro nás Java programátory naprosto nepochopitelně :) použije zásobník, který existoval při vytvoření uzávěru.
Jak z toho ven radí Otec Fura: já jsem použil způsob, který použitím Data Transfer Objectu vynutí vykopírování proměnné z lokálního kontextu:
var c = new Array(); for (var x=0; x<4; x++) { var Dto = function() { var value = x; this.getValue = function() { alert(value); }; } c[x] = new Dto().getValue; } c[2]();
Žádné komentáře:
Okomentovat