Variáveis declaradas com var
funções e no script em nível de escopo global podem ser acessadas com variable_name e window.*variable_name*
.
var foo = "10";
let bar= "20";
function func(){
}
console.log(foo); //10
console.log(window.foo); //10
Eu estava em um estágio de substituição em:
var foo
, afoo
vinculação do identificador é criada e mantida pelo Global Execution Context > Realm > Global Environment Record 's Object Record .let bar
, abar
vinculação do identificador é criada e mantida pelo Global Execution Context > LexicalEnvironment > Global Environment Record's Declarative Record .
Quando o JS tenta acessar uma variável X
no código global, ele verifica primeiro sua vinculação no Registro de Objeto do Registro de Ambiente Global , seguido pelo Registro Declarativo do Registro de Ambiente Global ? Como o JS saberia qual X
vinculação de registro está disponível?
Não, o JS primeiro verifica o ambiente declarativo em busca do identificador e, em seguida, verifica o objeto global. Isso é descrito no método HasBinding() do Registro de Ambiente Global, onde você pode vê-lo verificar primeiro o ambiente declarativo e, em seguida, o objeto global. Este método é usado ao resolver um identificador na operação abstrata GetIdentifierReference() .
Você também pode ver isso em ação no código abaixo,
const name = ...
cria uma vinculação no registro de ambiente declarativo do ER Global e, em seguida, acessá-lo comconsole.log(name);
imprime seu valor, não o valor dewindow.name
(que seria impresso se o objeto global estivesse sendo verificado primeiro em vez do ambiente declarativo).