Javascript: область видимости переменной - PullRequest
0 голосов
/ 10 октября 2019

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

Я попробовал первую часть кода ниже, и она не работает. Вторая часть работает. Может кто-нибудь пролить свет на разницу?

//// does not work
function a() {
    console.log(v1);
}

function b() {
    let v1 = 1;
    a();
}

b();

//// does work

function a() {
    console.log(v1);
}

function b() {
    a();
}

let v1 = 1;
b();

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

ОК, давайте посмотрим на это:

//// does not work
function a() {
    console.log(v1);
}

function b() {
    let v1 = 1;
    a();
}

b();

В приведенном фрагменте кода у вас есть 2 функции ( a () и b () ) и вызовите метод b () из вашей "основной" функции (которая не названа, но есть). В a () вы пытаетесь получить прямой доступ к переменной локальной области из b () - чего вы не можете.

//// does work

function a() {
    console.log(v1);
}

function b() {
    a();
}

let v1 = 1;
b();

Так что в этом фрагменте кода вы такжеиметь a () и b () - а также переменную v1 . Поскольку это объявляется в публичном пространстве (перед вызовом b () - что затем вызывает a () ), оно также доступно в вызываемых вами методах.

0 голосов
/ 10 октября 2019

Ключевое слово let задает область видимости переменной уровня блока, то есть переменная v1 в b() может использоваться только внутри b(). a() не знает, что такое v1.

//// does not work
function a() {
    console.log(v1);
}

function b() {
    let v1 = 1;
    a();
}

b();

В этом примере v1 устанавливается в глобальной области видимости, поэтому все ваши функции его распознают.

//// does work

function a() {
    console.log(v1);
}

function b() {
    a();
}

let v1 = 1;
b();
...