<html> <head> <script> function print(t){document.getElementById("info").innerHTML+=t;} function actions() { this.list=new Array(); //lista funkcji do wywołania this.index=0; //indeks aktualnej funkcji do wywołania } actions.prototype.add = function(funct){ _this = this; this.list.push(function(){ funct(); _this.doit() }); } actions.prototype.doit = function() { if(this.index>=this.list.length) //koniec listy { print(']('+(this.list.length)+')'); return; // koniec listy, a więc koniec roboty. } this.list[this.index++](); //uruchom kolejną funkcję z listy } actions.prototype.do = function(){ print('['); this.doit(); } function a1() { print(5); } function a2() { t2 = new actions(); t2.add(function(){print(6);}); t2.add(function(){print(7);}); } function load() { t1 = new actions(); t1.add(function(){print(1);}); t1.add(function(){print(2);}); t1.add(function(){print(3);}); t1.add(function(){print(4);}); t1.add(a2); //t1.add(a1); (*) t1.do(); //W przypadku, gdy w (*) jest t1.add(a1), wszystko działa zgodnie z oczekiwaniami. //W przypadku, gdy w (*) jest t1.add(a2), oczekuję, że // napisze '[1234', potem stworzy listę dwóch funkcji t2 (ale ich nie wywoła), a następnie napisze '](5)', bo było 5 funkcji na liście. // On wyświetla [123467](2). Niejako stworzenie listy t2 nadpisuje listę t1, ale nie tyle wstawia wyrazów z t2 do listy t1, bo na końcu lista nie ma długości 7, ale 2, czyli długość t2. //Dlaczego? }; </script> </head> <body onload = "load();"> </body> </html>
Problem wstawiłem do komentarza. Domyślam się, że problemem jest ten nieszczęsny _this, który z jednej strony muszę użyć zamiast this, ponieważ przy uruchamianiu funkcji z listy, zmienna this nie musi się odnosić do danego obiektu. Mam wrażenie, że to, że w obu obiektach t1 i t2 jest ta sama nazwa _this powoduje ten konflikt.
Uprzejmie proszę o pomoc, jak uporać się z problemem.