2012-04-04 9 views
7

To jest coś, że jestem pewien, że powinienem znać odpowiedź, ale albo jestem po prostu głupi albo ja po prostu jakoś nigdy nie natknąć to wcześniej ...Jaki jest kontekst funkcji w tablicy?

Biorąc pod uwagę następujące tablicę, ogłoszony w zakres globalny:

var arr = [function() { 
    console.dir(this); 
}]; 

Liczyłam this odnieść się do obiektu window. Jednak przy wywołaniu funkcji:

arr[0]();​ //Logs Array 

Wydaje się, że this rzeczywiście odnosi się do tablicy. Potem, kiedy przechowywać odwołanie do funkcji w innej zmiennej i nazwać, thisrobi odnoszą się do obiektu window:

var func = arr[0]; 
func(); //Logs Window 

Więc dlaczego kontekst zmian funkcji? Oto fiddle demonstrating the above two cases.

+0

"Ten" odnosi się do właściciela, więc domyślam się, że właściciel jest podnoszony w czasie wykonywania. http://www.quirksmode.org/js/this.html – Silvermind

Odpowiedz

5

Po wywołaniu funkcji jako nieruchomego obiektu, takiego jak obj.func(), this dotyczy obj.
To jest dokładnie to, co tutaj robisz. arr jest twoim obiektem i 0 jest właściwością posiadającą funkcję.

Uwaga: W końcu tablice są po prostu obiektami, a ich elementy są wartościami ich właściwości (chociaż właściwości są zazwyczaj ciągami liczbowymi (wszystkie właściwości są ciągami)).

Zobacz MDN - this uzyskać więcej informacji, w tym przypadku:

Gdy funkcja jest wywoływana jako metoda obiektu, jego this jest ustawiona na obiekcie metody zwanej dalej.

W swoim drugim przypadku należy wywołać funkcję „autonomicznego”, stąd this dotyczy window. Jeśli kod był uruchamiany w trybie ścisłym, this byłby undefined.

+0

Dokładniej 'window' ** jest ** obiektem, a każdy globalny ** jest ** argumentem' window'. – freakish

+0

"W końcu tablice są po prostu obiektami" ... to sprawia, że ​​ma to sens. Po prostu byłem głupi. Dzięki. –

+0

@ Dziwaczny: jak to jest związane z pytaniem? 'this' odnosi się do' okna' nawet jeśli zmienna nie jest globalna. W kodzie OP "func" może być również zmienną lokalną w innej funkcji. Zakładam, że masz na myśli globalne zmienne to * właściwości * "okna". –

0

To dlatego, że słowo kluczowe jest w rzeczywistości operatorem, który zwraca referencję do właściciela (lub właściciela) funkcji, w której został wywołany. Ponieważ w pierwszym przypadku posiadaczem jest tablica (która jest obiektem), zwraca tablicę. W drugim przypadku uchwytem jest obiekt okna.

Aby uzyskać więcej informacji, patrz this article.

0

zauważyć:

w JavaScript, this zawsze odnosi się do właściciela funkcyjnego.

możesz przeczytać więcej na ten temat at quirksmode.

0

Ponieważ element jest członkiem tablicy i thiszawsze punkty do obiektu właściciel (chyba że grasz z bind()/call()/apply() etc). Jeśli nie jesteś częścią obiektu, this będzie obiektem globalnym; która jest window w środowisku przeglądarki. Wyjątkiem jest to, że jesteś w trybie ścisłym, gdzie thiswill be undefined.

Co robisz to samo skutecznie jak:

var ar = { 
    '0' : function() { 
     console.dir(this); 
    } 
} 

ar[0](); 
var func = ar[0]; 
func(); 

... co może więcej sensu koncepcyjnie.

http://jsfiddle.net/TVtwr/1/

+0

To nie jest to samo. Tablica to inny "typ" o innym zachowaniu niż zwykły obiekt. –

+0

@MichaelAnderson: Miałem na myśli pod względem rozdzielczości "tego". – Matt

Powiązane problemy