Słowo kluczowe this Zawsze odnosi się do obiektu, którego funkcja zawierająca jest metodą ".

Świetnie, brzmi wystarczająco proste, ale tutaj się zastanawiam ...

Na przykład:

function func1() {

  function func2() {
    alert(this == window); // true
  }

  func2();

  alert(this == window); // true
}

func1.func3 = function () {

  alert(this == window); // false
  alert(this == func1); // true

};

func1();
func1.func3();

Teraz, ponieważ func1 jest metodą obiektu global (window) (obiekt funkcyjny przypisany do właściwości func1 globalnej / EM> Obiekt) Sense ma sens, że this wewnątrz func1 odnosi się do obiektu globalny , a od func3 jest metodą func1 S Funkcja Obiekt Mam sens, że this wewnątrz func3 odnosi się do obiektu funkcyjnego func1.

To, co mnie niepokoi jest func2. Wiem, że this wewnątrz zagnieżdżonej funkcji ma również odniesienie do obiektu Global , ale nie jestem pewien, dlaczego od func2 nie jest metodą globalny obiekt . O ile rozumiem (i jest to część, którą mógłbym całkowicie się mylić) func2 jest metodą połączenia func1 "s Call (Activation / Variable). Teraz, jeśli mam rację o tym (i nie jestem pewien, czy jestem), nie powinien this wewnątrz func2 odnoszą się do obiektu połączenia func1 zamiast < EM> Global obiekt?

Więc myślę, że moje pytanie brzmiałoby: jest zagnieżdżoną funkcją Metoda obiektu wywołania (aktywacja) funkcji jest zagnieżdżona, a jeśli tak, nie powinno być this odnosić się do tego obiektu połączenia EM> Global obiekt?

4
Korikulum 13 wrzesień 2012, 20:29

3 odpowiedzi

Najlepsza odpowiedź

To słowo kluczowe zawsze odnosi się do obiektu, który funkcja zawierająca jest metodą.

Nie. Niestety, nie jest to łatwe. Dokumentacja słowa kluczowego {X0}} MDN daje dobry przegląd. Jest ustawiony na obiekt, gdy funkcja jest wywoływana jako metoda na , ale są inne możliwości. Domyślnie jest to, że this undefined, gdy jest nazywany bez niczego wyjątkowego, jak robisz z func1 i func2. Dla niechlujnych (niezbyt ścisłych) funkcji trybu undefined (i null) nie są jednak stosowane, this wskażą się do obiektu globalnego (window w przeglądarkach) dla nich Ten przypadek - to, co obserwujesz.

Ale może również wskazywać na świeże instancje obiektów, gdy funkcja zostanie wywołana jako konstruktor (ze słowem kluczowym new) lub do celu zdarzenia (jak element DOM), gdy jest używany jako przewodnik. Ostatni, ale nie tylko można go ustawić ręcznie z call, apply lub bind ...

this nie ma nic wspólnego z zagnieżdżeniem. Deklaracje / wyrażeń funkcji zagnieżdżania wpływa tylko na zakres ("prywatność", dostępność) zmiennych. Podczas gdy zmienny zakres funkcji nigdy się nie zmienia, wartość this może być różna na każdym wywołaniu - jest bardziej jak dodatkowy argument.

5
Bergi 27 wrzesień 2015, 12:55

Znaczenie słowa kluczowego this wewnątrz funkcji zależy od sposobu wywołania funkcji. W JavaScript jest 4 różne wzory wywołania funkcji.

  1. Wzór inwokacji funkcji foo()
  2. Wzór inwokacji metody o.foo()
  3. Wzór inwokacji konstruktora new foo
  4. Zadzwoń / zastosuj wzór foo.apply(...) lub foo.call(...)

Tylko w # 2 to przypadek, że this wewnątrz funkcji odnosi się do obiektu, którego funkcja jest metodą.

Wywołujesz func2() za pomocą wzoru wywołania funkcji. Podczas tego, this odnosi się do obiektu globalnego.

Jak sugeruje @bergi, zobacz HTTPS: //developer.mozilla. Org / EN-US / DOCS / JavaScript / Reference / Operatory / To Więcej szczegółów na temat znaczenia this i różnych wzorców wywołania funkcji.

3
Bruce Harris 13 wrzesień 2012, 16:52

Ale nie jestem pewien, że ponieważ FUNC2 nie jest metodą obiektu globalnego.

Każda rzecz zdefiniowana w funkcji jest lokalna do zakresu tej funkcji. Więc func2 należy do lokalnego zakresu func1 i dlatego nie jest dołączony do window.

W JavaScript wartość this jest ogólnie oparta na tym, jak nazywasz funkcję. Po wywołaniu funkcji bez wiodącego obiektu, this jest zwykle ustawiony na globalny obiekt nadrzędny, który jest window.

Możesz wyraźnie ustawić wartość this na trzy sposoby:

myObj.func(a, b); //this set to myObj implicitly because myObj is the parent 

func.call(myObj, a, b); //this set to myObj explicitly; the first argument 
                        //to call sets the value of this for that function

func.apply(myObj, [a, b]); //this set to myObj explicitly; the first argument
                           //to apply also sets the value of this for that
                           //function.

this może być trudną koncepcją. MDN ma Dobry artykuł o this .

1
Vivin Paliath 13 wrzesień 2012, 16:41