Объявление функции в областях вложенных блоков - PullRequest
1 голос
/ 06 ноября 2019

Как и в случае этой ссылки , оператор объявления функции и объявление переменной НЕ имеют область действия блока . Поэтому я спрашиваю, почему код ниже выполнен таким образом.

    //javascript es6
    {
        function bar() {
            console.log("1");
        }
    }
    function bar() {
        console.log("2");
    }

    bar(); //prints "1" not "2"
    this.bar() //also prints "1" not "2"

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

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

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

Давайте сначала переименуем функции для этого, чтобы я мог лучше объяснить, как это работает:

    {
        function bar() {
            console.log("1");
        }
    }
    function foo() {
        console.log("2");
    }

Что делает ваш компилятор, он просматривает ваш js-файл и видит, что есть одно объявление функции, которое является функцией foo (игнорируя то, что находится внутри скобок). Затем он запускает файл js, как обычно, заходит в скобки и видит, что есть еще одно объявление функции (функция bar ()), которое объявлено после функции foo ().

Итак, по сути, эторезультат, который вы получите:

bar() // returns "1"

{
    function bar() {
        console.log("2")
    }
}
bar() // returns "2"

function bar() {
    console.log("1")
}

bar() // returns "2"

Надеюсь, это имеет смысл.

Для получения дополнительной информации, попробуйте поискать выражение функции против объявления функции , а также узнать, какработает компилятор javascript, это поможет вам лучше понять, как работает подъем.

1 голос
/ 06 ноября 2019

Похоже, что эта проблема из-за подъема JavaScript. По какой-то причине из того, что я могу сказать, объявление вашей функции в области видимости блока меняет способ ее поднятия. Подробнее здесь: https://www.w3schools.com/js/js_hoisting.asp

...