Имея var variable
внутри local_var_dec
, вам 're shadowing глобальный с совершенно другим местным переменной. Это означает, что глобальный недоступен в пределах local_var_dec
. И потому, что var
переменных водрузили, он не доступен где-нибудь в local_var_dec
, точно так, как если бы это выглядело так:
function local_var_dec(){
var variable; // ***
console.log("local: "+ variable);
if(typeof variable === 'undefined'){
variable = 2; // ***
}
}
Так это означает, что когда вы присваиваете ему, то вы присваиваете к местным переменная, а не глобальная; это не имеет никакого эффекта на глобальном уровне, поэтому, когда вы вызываете global_var_global
позже, вы видите исходное значение глобального.
Хотя вы все еще можете получить доступ к глобальному, вы не можете получить к нему доступ в виде переменной . Неявные globals¹, такие как yours (и объявленные с var
в глобальной области), являются свойствами глобального объекта и поэтому могут быть доступны через глобальный объект, доступный как window
в браузерах. Таким образом, window.variable
получит доступ к нему в пределах local_var_dec
в браузерах. В других средах глобальный объект, определяемый средой, может быть или не быть глобальным. Например, в NodeJS есть global
. Однако вы всегда можете получить ссылку на глобальный объект от в глобальной области видимости (при условии, что среда позволяет запускать код в глобальной области, например, NodeJS).
Фундаментально, однако, избежать затенения переменных, если вам нужно получить доступ к ним, так что особенность глобалов является A) Специфическая для глобалов, B) не очень хорошая идея, и C) Не доступно с новыми let
и const
деклараций ,
Вот фрагмент с аннотацией, что именно происходит, и показывая с помощью window.variable
(хотя опять же, в идеале просто использовать другое имя):
// This creates an *implicit global* by assigning
// to an undeclared identifier
variable = 1;
local_var_dec();
global_var_global();
function local_var_dec(){
// This shows `undefined` because `variable` in the below is the *local*
// variable you've declared with `var`, even though the `var` hasn't
// been reached yet. `var` is *hoisted* to the top of the function.
console.log("local: "+ variable);
// This is still the local, so it's still `undefined`
if(typeof variable === 'undefined'){
// This sets the *local* variable to 2; it has no effect at all on
// the global
var variable = 2;
}
// If you wanted, you could use `window.variable` here
console.log("window.variable = " + window.variable);
}
function global_var_global(){
// Because there's no `var` in this function, this us using the global
// `variable`
console.log("global: "+ variable);
if(typeof variable === 'undefined'){
variable = 2;
}
}
¹ неявной глобальной - глобально создано без какого-либо объявления, назначая ему. Больше в моем блоге The Horror of Implicit Globals и MDN.
Почему бы не использовать 'var' и не объявить переменную заранее? –
'var variable' на глобальном уровне. попробуйте вот так: – prasanth