W przeglądarce działa w zasięgu globalnym, this
jest zawsze window
w przykładzie
var obj1;
var obj2;
function x() {
obj1 = this; // window
}
function y() {
obj2 = this; // window
}
x();
y();
console.log(obj1 === obj2); // window === window = true
console.log(obj1 === this); // window === window = true
To nie jest, jak to działa w węźle. W węźle.js wszystkie moduły (pliki skryptów) są wykonywane we własnym closure, podczas gdy przeglądarki wykonują wszystkie pliki skryptów bezpośrednio w zasięgu globalnym.
Innymi słowy, w prawie każdym pliku uruchomionym w węźle, this
będzie po prostu pustym obiektem, ponieważ Węzeł zawija kod w anonimowej funkcji, która jest wywoływana natychmiast, a Ty uzyskasz dostęp do globalnego zakresu w tym kontekście zamiast tego z GLOBAL
.
to również wspomniane w Globals documentation:
Niektóre z tych obiektów nie są rzeczywiście w zasięgu globalnym, ale w zakresie modułu - zostanie to odnotowane.
Jednak, gdy wywołanie funkcji bez konkretnego kontekstu node.js, to będzie zazwyczaj domyślnie do globalnego obiektu - To samo GLOBAL
wspomniano wcześniej, jak to kontekst wykonania.
Tak więc poza funkcjami, this
jest pustym obiektem, ponieważ kod jest zawijany w funkcję przez węzeł, aby utworzyć własny kontekst wykonania dla każdego modułu (pliku skryptu), podczas gdy wewnątrz funkcji, ponieważ są one nazwane z żadnym określonym kontekście realizacji, this
jest węzeł GLOBAL
obiekt
W node.js ty chcesz dostać
var obj1;
var obj2;
function x() {
obj1 = this; // GLOBAL
}
function y() {
obj2 = this; // GLOBAL
}
x();
y();
console.log(obj1 === obj2); // GLOBAL === GLOBAL = true
console.log(obj1 === this); // GLOBAL === {} = false
Jeżeli ostatni this
jest rzeczywiście pusty obiekt, jak wyjaśniono powyżej
Dla kompletności, to warto zauważyć, że w trybie ścisłym, można uzyskać taki sam wynik w przeglądarce (true, false
), jak w węźle, ale to dlatego, że zmienne są po prostu przeciwieństwem tego, co są w węźle
"use strict"
var obj1;
var obj2;
function x() {
obj1 = this; // undefined
}
function y() {
obj2 = this; // undefined
}
x();
y();
console.log(obj1 === obj2); // undefined === undefined = true
console.log(obj1 === this); // undefined === window = false
To dlatego, że wartość przekazana jako this
do funkcji w trybie ścisłym nie jest zmuszony do życia obiektu (aka "w pudełku").
Dla normalnego funkcjonowania w trybie non-ścisłym, this
zawsze jest obiekt, i to zawsze globalny obiekt jeśli nazywa z undefined
lub null
to-value, to znaczy bez konkretnego kontekstu wykonania.
Nie tylko jest to koszt związany z wydajnością, ale ekspozycja obiektu globalnego w przeglądarkach stanowi zagrożenie bezpieczeństwa, ponieważ obiekt globalny zapewnia dostęp do funkcji, które muszą być ograniczone ze względu na środowisko JavaScript "zabezpieczone".
Zatem dla ścisłego trybu funkcji, określona this
nie jest zapakowane w obiekcie, a jeśli nie jest określony, this
będzie undefined
funkcje wewnątrz, jak przedstawiono powyżej, ale this
nadal będzie okno w zasięgu globalnym.
To samo dzieje się w trybie ścisłym w węźle.js, gdzie this
w funkcjach nie jest już GLOBAL
, ale undefined
ipoza tymi funkcjami nadal będzie tym samym pustym obiektem, a końcowym rezultatem będzie nadal true, false
, ale wartość this
będzie inna w trybie ścisłym w węźle .js również.
możesz chcieć wydrukować "to", aby zobaczyć, co to jest. W przeglądarce powinno być domyślnie 'window', w węźle nie jestem pewien co to jest. – tkausl