Почему локальная переменная убивает мою глобальную переменную?
Извините за этот вопрос, но эта проблема действительно испортила мой день.
Следующий код предупреждает 10 как следует:
var globalId='10';
function check(){
alert(globalId);
}
check();
Но этот следующий код предупреждает undefined:
var globalId='10';
function check(){
alert(globalId);
var globalId;
}
check();
Мне известно, что если я объявляю переменную в функции своей локальной переменной, но если я уже объявил ее глобальным, как может быть, что мои предупреждения говорят undefined?
Это простой пример, но в моем исходном коде я сделал много вещей между началом функции, а затем до конца я проверил, было ли определено globalId
, иначе определите его: if(!globalId){var globalId;}
Это означало, что мое оповещение, расположенное в верхней части функции, сгенерировало undefined, как если бы JavaScript сначала выполнил всю функцию, просто чтобы узнать, могут ли быть объявлены какие-либо переменные, и если да, объявите их, и поэтому мое предупреждение указывает к "необъявленной" переменной.
Может кто-нибудь объяснить мне, почему это происходит, и если это правда, что JavaScript "предварительно объявляет" все переменные перед выполнением функции, даже переменные, объявленные в условиях, даже не встречающихся?
Ответы
Ответ 1
В javascript вы должны знать, что есть что-то, называемое ПОДГОТОВКА.
То, что это по существу означает, когда вы объявляете какие-либо локальные переменные, объявление переменной автоматически переносится в верхнюю часть области.
например: -
var globalId='10';
function check(){
alert(globalId); var globalId; }
check();
Изменения в -
var globalId='10';
function check(){
var globalId;
alert(globalId);}
check();
Так как globalID по-прежнему не получает никакого значения, он возвращает undefined в вашем выводе. Локальные переменные всегда получают приоритет над глобальными переменными с тем же именем.
Ответ 2
Да, все переменные, объявленные в любом месте функции, являются локальными для этой функции и существуют во всем функциональном коде; они будут использоваться в предпочтении к глобальным именам с тем же именем.
Из https://developer.mozilla.org/en/JavaScript/Guide/Values,_Variables,_and_Literals#Variable_Scope:
JavaScript не имеет области действия блока; скорее, он будет локальным для кода, в котором находится блок. [...] Еще одна необычная вещь о переменных в JavaScript заключается в том, что вы можете ссылаться на переменную, объявленную позже, не получая исключения. Эта концепция называется подъемом; переменные в JavaScript в некотором смысле "подняты" или подняты до вершины функции или оператора.
Ответ 3
В вашей второй части кода локальная переменная маскирует глобальную.
var globalId='10';
function check() {
// Your are defining a local variable in this function
// so, the global one is not visible.
alert(globalId);
var globalId;
}
check();
Тот факт, что оператор yopur var
находится в конце определения функции, ничего не меняет: глобальная переменная маскируется для всей функции.
Итак, для всего выполнения функции переменная globalId
будет ссылаться на локальную, а не глобальную.
Однако за пределами этой функции глобальная переменная все равно будет существовать - она просто не будет видна изнутри функции из-за оператора var
.
Ответ 4
Как уже было сказано, в соответствии с правилами облачности JavaScript локальная переменная маскирует глобальную для всей функции. Однако глобальной переменной может быть accessd, попробуйте следующее
var globalId='10';
function check() {
// Your are defining a local variable in this function
// so, the global one is not visible.
alert('Local : ' + globalId + ', Global : ' + window.globalId);
var globalId;
}
check();
Ответ 5
вы объявляете новую переменную globalId
внутри функции, поэтому ее undefined и это правильно. И нет, он не убивает вашу глобальную переменную, вы можете проверить ее, добавив alert(globalId);
после вызова check();
.
Ответ 6
как будто Javascript сначала выполнил всю функцию, просто чтобы увидеть, могут ли быть объявлены какие-либо переменные
Это ответ, более или менее.
Интерпретатор JavaScript ищет объявления переменных внутри каждой области действия, а затем "перемещает их" в верхнюю часть области.
Ответ 7
var globalId='10';
function check(){
let globalId = '5';
alert(globalId);
}
check();
// use let to set a local variable between any {}