Путаница с областью JavaScript

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

Это регистрирует значение 1 на консоли:

var a = 1;
function b() {
    a = 10;
    return;
    function a() {}
}
b();
console.log(a);

И таинственно, этот журнал 10:

var a = 1;
function b() {
    a = 10;
    return;        
}
b();
console.log(a);

Итак, что происходит под капотом?

Ответ 1

Я нахожу первый пример более загадочным...

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

В первом примере вы объявляете переменную a внутри функции, но необычным образом: объявляя функцию с именем a. Поэтому назначение a будет использовать эту локальную "переменную".

Две вещи, которые нужно забрать здесь:

a) Объявления переменных и функций "поднимаются" вверху области. Пока function a(){} написано ближе к концу, переменная a для ее хранения уже создана и видима в верхней части области.

b) Функции также могут использоваться как переменные. Вы можете передавать функции вокруг, вы можете повторно назначать определения функций. Они используют одно и то же пространство имен с другими переменными.

Ответ 2

Вы можете использовать Visual-Studio для кодирования:

введите описание изображения здесь

Программирование кода в TypeScript -File позволит вам увидеть переменную Типы путем наведения переменной.

введите описание изображения здесь

Он также предупредит вас, когда вы попытаетесь применить численное значение 10 к переменной "a", которая была впервые объявлена ​​как функция. Что мне нравится в TypeScript, вы можете получить дополнительную информацию об этом здесь: http://www.typescriptlang.org/

Ответ 3

Потому что, когда вы используете объявленный function, он поднимается и превращается в выражение функции, то есть var a = function() {}; Это создает столкновение с вашей переменной a.

Ответ 4

JavaScript основан на интерпретаторе. Javascript {block} не имеет области видимости, но функция имеет.

В вашем примере

var a = 1;
function b() {
    a = 10;
    return;
    function a() {}
}
b();
console.log(a);

во-первых, вы назначаете a целым числом 10, но в конце вы переназначаете свой a как функцию, которая исчезнет в конце области.

В этом коде

var a = 1;
function b() {
    a = 10;
    return;
    function foo() {}
}
b();
console.log(a);

ваш a не заменен и возвращается в глобальную область, он будет записывать 10.