Jest trochę czegoś o zakresie, w którym po prostu się mylę:

this.init = function(){
  var t = this;
  setTimeout(function(){
    // why is t still available here?
    t.initgame();
    // but not this?
    this.initgame();
  }, 500);
}

this.initgame = function() {
  // yada yada
}

Dostaję to wewnątrz funkcji anonimowej, zakres jest inny niż na zewnątrz. Ale dlaczego w powyższym przykładzie jest zmienna "T" dostępna w funkcji limitu czasu, podczas gdy "to" nie działa?

0
Kokodoko 5 grudzień 2013, 18:40

2 odpowiedzi

Najlepsza odpowiedź

Problem polega na tym, że setTimeout jest nazywany window jako zakres.

Za pomocą dedykowanej zmiennej do przechowywania {X0}} (t) jest doskonale ważnym i zwykłym rozwiązaniem.

Na nowoczesnych przeglądarkach, bind Czasami jest wygodny:

setTimeout((function(){
    // use this
}).bind(this), 500);
3
Denys Séguret 5 grudzień 2013, 14:42

Gdy funkcja anonimowa działa, nie działa już jako funkcja członka init, ale raczej funkcja najwyższego poziomu window. W rezultacie this.initgame() nie ma znaczenia.

Na przykład, działa console.log(this) wewnątrz funkcji limitu czasu zwraca w następujący sposób:

Window {top: Window, window: Window, location: Location, external:...

Po użyciu var t = this przypisujesz odniesienie do bieżącego obiektu, który działa.

2
BenM 5 grudzień 2013, 14:43