var arrayfunc = [function(){return this;}];
var func = arrayfunc[0];
arrayfunc[0]();    //[function (){return this;}]
func();            //Window

Nie wiem dlaczego this nie jest taki sam? Czy mi pomożesz ?

0
acjialiren 15 sierpień 2012, 11:53

3 odpowiedzi

Najlepsza odpowiedź

Pomyśl jak poniżej:

arrayfunc[0](); // this refer to arrayfunc
window['func'](); // this refer to window

Nawet przez arrayfunc[0] === func Wróć true, dzwoniący jest inny.

arrayfunc[0](); Nazywany funkcją przez obiekt arrayfunc,

window['func'](); Nazywana funkcją przez obiekt window.

3
xdazz 15 sierpień 2012, 08:05

Ponieważ jest to dynamiczny wskaźnik do zakresu funkcji. Nie ma na przykład stałego odniesienia, jak w Javie.

1
Florian Salihovic 15 sierpień 2012, 07:55

Jest to powszechne nieporozumienie. Kiedy dokonasz aliasu do metody - tj. Jak masz, popełnij go do zmiennej - zrozumieć, że tracisz kontekst this, w którym rozpoczął się oryginalna metoda.

Na przykład:

var arr = [function() { alert(this[1]); }, 'hello'];
arr[0](); //'hello' - 'this' is the array
var func = arr[0];
func(); //undefined - 'this' is Window

Linia 2 Powraca "Hello", ponieważ metoda działa w kontekście tablicy - ponieważ wywołujemy go z wnętrza .

Linia 4 jednak wywołuje tę samą metodę, ale z kontekstu aliasu ustawiamy (func). To resetuje swój kontekst, więc this wskazuje na domyślną - w przeglądarce, oznacza to window.

Jeśli chcesz dokonać skrótu do funkcji, ale zachowaj swój kontekst, możesz to zrobić za pomocą bind() (tylko przeglądarki ECMA5).

var func = arr[0].bind(arr);
func(); //'hello'

bind() tworzy nową funkcję, ale związaną konkretnym kontekstem - w twoim przypadku, początkową tablicę zostało zrobione.

1
Mitya 15 sierpień 2012, 08:18