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
Author: Michał Perłakowski, 2015-02-28

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.

 23
Author: Felix Kling,
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

Według specyfikacji :

"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

 3
Author: Tracker1,
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