Понимание функции функции JavaScript

Ниже приведен код JavaScript. Я пытаюсь понять область функций в JavaScript и после статьи здесь. Я воспроизвожу код ниже -

var cow = "purple"; // just a random cow

var f = function (x) {
    var r = 0;
    cow = "glue";
    if (x > 3) {
        var cow = 1; // a local variable
        r = 7;
    }
    return r;
};

var z = f(2);
alert(cow); // returns purple

Я не совсем понимаю, почему строка "фиолетовый" предупреждается. Строка cow = "glue"; должна установить значение переменной cow для "glue". Если я удаляю блок if, а затем предупреждаю корову в последнем утверждении, я вижу, что строка "клей" предупреждается.

Когда вызывается f (2), код кода if не вводится, и ничего в нем не выполняется, поэтому почему я вижу разные результаты? Поэтому почему предупреждение о возврате коров в последний оператор возвращает строку "фиолетовый"?

Ответ 1

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

var f = function (x) {
    var cow, r;
    r = 0;
    cow = "glue";
    if (x > 3) {
        cow = 1; // a local variable
        r = 7;
    }
    return r;
};

Внутри функции, которую вы всегда назначаете локальному cow, никогда не глобальному.

Ответ 2

Две вещи, которые нужно понимать здесь, - это то, что переменные Javascript поднимаются в верхней части своей области, а javascript не имеет области блока.

Итак,

  • Все переменные в области считаются объявленными в начале области
  • оператор if не создает новую область.

Итак, ваш пример эквивалентен

var cow = "purple"; // just a random cow

var f = function (x) {
    var cow, r = 0;
    cow = "glue";
    if (x > 3) {
        cow = 1; // a local variable
        r = 7;
    }
    return r;
};

var z = f(2);
alert(cow); // returns purple

Объявление var в выражении if поднимается вверх. В этот момент все ссылки на корову внутри функции ссылаются на локальную переменную корову, а не на корову из внешней области.

Ответ 3

Javascript не имеет области блока (кроме блоков catch).
Все инструкции var поднимаются в верхнюю часть содержащейся функции.

Следовательно, cow ссылается на локальную переменную где угодно в функции, даже если if никогда не выполняется.

Ответ 4

Ты действительно не читал эту статью, не так ли? В нем явно указано

Включается ли cow в "glue" при вызове f(2)? Нет, cow безопасен в приведенном выше коде, потому что объявление var cow внутри блока if применяется ко всей функции. Это означает, что cow является локальной переменной для всей функции.

Однако, когда вы удаляете блок if, вы также удаляете внутри него объявление переменной, и назначение будет нацелено на глобальную переменную.