Подтвердить что ты не робот

Почему локальная переменная убивает мою глобальную переменную?

Извините за этот вопрос, но эта проблема действительно испортила мой день.

Следующий код предупреждает 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 "предварительно объявляет" все переменные перед выполнением функции, даже переменные, объявленные в условиях, даже не встречающихся?

4b9b3361

Ответ 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 {}