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

Перемещаемые переменные JavaScript

Я не совсем понимаю, почему следующие дисплеи "поднимаются" к концу.

var x = 'set';
var y = function () 
{
    // WHAT YOU DON'T SEE -> var x; 
    // is effectively "hoisted" to this line!

    if (!x) 
    { 
        // You might expect the variable to be populated at this point...it is not
        // though, so this block executes
        var x = 'hoisted'; 
    }

    alert(x); 
}

//... and this call causes an alert to display "hoisted"
y();

Любые указатели будут оценены.

4b9b3361

Ответ 1

Цитирование MDN Docs на var hoisting,

Поскольку объявления переменных (и декларации вообще) обрабатываются до того, как выполняется какой-либо код, объявление переменной в любом месте кода эквивалентно объявлению ее вверху. Это также означает, что переменная может как представляется, используются до его объявления. Это поведение называется "подъем", поскольку, как представляется, объявление переменной перемещается в начало функции или глобального кода.

Итак, в вашем случае JavaScript знает, что локальная переменная (а не заявленная за пределами) x определена где-то в функции, но она не знает ее фактического значения до тех пор, пока выполнение не достигнет инструкции присваивания, присваивает x. (Заявления обрабатываются во время компиляции, и настройки выполняются во время выполнения). Пока не будет выполнено назначение, будет использоваться значение по умолчанию undefined. Поскольку undefined является ложным, условие

if (!x) {

выполняется и выполняется оператор присваивания. Вот почему вы получаете hoisted в поле предупреждения.


Скажем, вы не объявили x внутри функции,

var x;

var y = function () {
    if (!x) {
        x = 'hoisted';
    }
    alert(x);
}

y();
alert(x);

Здесь, поскольку x не объявляется нигде внутри функции, во время выполнения JavaScript будет искать x в более высоких областях. В этом случае он находит это прямо вне функции. Таким образом, будет использоваться x. Поскольку вы назначили hoisted на x, внутренний alert также скажет hoisted и после выхода из функции alert(x) также будет предупреждать hoisted.

Ответ 2

Переменные объявления поднимаются вверху области. Таким образом, ваш код эквивалентен этому:

var x = 'set';
var y = function () {
    var x;
    if (!x) {
        x = 'hoisted';
    }
    alert(x);
}

y();

Когда y выполняется, var x скрывает внешнюю область x, поэтому внутри функции y x есть undefined после первой строки объявления.

Ответ 3

Ха-ха, проблема в том, что вы создаете переменную x Again.

var x = 'set';
var y = function (){

if (!x) 
{ 
  // just use the = sign to update the value of it.
    x = 'hoisted'; 

};
alert(x);
 };

y();

Ответ 4

этот ответ подробно объясняют различные области переменных. В вашем конкретном случае вы можете использовать ссылку на:

this.x; 

Для доступа к глобальной переменной x вне функции. Поскольку внутри функции вы пытаетесь получить доступ к переменной undefined, используя ключевое слово this, вы делаете ссылку на переменные вне функции.

И часть

if(!x)

Это правда, потому что вы тестируете: is false и x в этой точке undefined, потому что не существует в области видимости функции, а undefined рассматривает одно из ложных значений в JS, для получения дополнительной информации см. здесь.