Czy polecenia pozwalają tworzyć właściwości w obiekcie globalnym?
W JavaScript deklaracje var
tworzą właściwości obiektu globalnego:
var x = 15;
console.log(window.x); // logs 15 in browser
console.log(global.x); // logs 15 in Node.js
ES6 wprowadza zakres leksykalny z let
deklaracje, które mają zasięg blokowy.
let x = 15;
{
let x = 14;
}
console.log(x); // logs 15;
Czy jednak deklaracje te tworzą właściwości obiektu globalnego?
let x = 15;
// what is this supposed to log in the browser according to ES6?
console.log(window.x); // 15 in Firefox
console.log(global.x); // undefined in Node.js with flag
2 answers
Czy polecenia
let
tworzą właściwości obiektu globalnego?
Zgodnie z spec, nie:
Globalny rekord środowiskowy jest logicznie pojedynczym rekordem, ale jest określony jako złożony enkapsulujący obiektowy rekord środowiskowy i deklaratywny rekord środowiskowy. Zapis środowiska obiektu mA jako obiekt podstawowy globalny obiekt skojarzonego Realm. Ten globalny obiekt jest wartością zwracany przez konkretną metodę
GetThisBinding
global environment record. Komponent object environment record globalnego rekordu środowiska zawiera powiązania dla wszystkich wbudowanych globali ( klauzula 18) i wszystkich powiązań wprowadzonych przez funkcję , GeneratorDeclaration , or VariableStatement zawarte w kodzie globalnym. powiązania dla wszystkich innych deklaracji ECMAScript w kodzie globalnym są zawarte w środowisku deklaratywnym zapis Składnik globalnego zapisu środowiska.
Jeszcze jakieś wyjaśnienie:
A deklaratywny zapis środowiskowy przechowuje powiązania w wewnętrznej strukturze danych. Nie da się w żaden sposób uchwycić tej struktury danych (pomyśl o zakresie funkcji).
Zapis środowiska obiektu używa rzeczywistego obiektu JS jako struktury danych. Każda własność obiektu staje się wiązaniem i odwrotnie. The global environment posiada obiekt environment, którego "obiekt wiążący" jest obiektem globalnym. Innym przykładem jest
with
.
Teraz, jak stwierdza cytowana część, tylko FunctionDeclaration s, GeneratorDeclaration s I VariableStatementS tworzą powiązania w globalnym zapisie środowiska object. Tzn. tylko te powiązania stają się właściwościami obiektu globalnego.
Wszystkie pozostałe deklaracje (np. const
i let
) przechowywane są w globalny zapis środowiska deklaratywny zapis środowiska, który nie jest oparty na obiekcie globalnym.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-02 06:21:19
"deklaracje let i const definiują zmienne, które są ograniczone do środowiska leksykalnego kontekstu uruchamiania."
Oznacza to, że powinieneś mieć dostęp do zmiennej wewnątrz zakresu wykonania, ale nie na zewnątrz. Rozszerza to zakres wykonania poza klasyczną strukturę zamknięcia JS funkcji-only lub global.
Definiowanie zmiennej let
pozostawia ją otwartą do interpretacji, jak widać w Firefoksie wiąże zmienna globalna, gdzie jako V8 / iojs nie.
Warto wspomnieć, że console.log(typeof x)
powróci number
w iojs. W praktyce nie należy definiować zmiennych poza modułami lub funkcjami w jak największym stopniu... szczególnie z const
i let
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-27 23:40:24