2015-11-22 3 views
14

У меня есть немного понимания об области 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); 

Так что же происходит под капотом?

+3

['use strict'] (http://stackoverflow.com/questions/1335851/) запретил бы объявление функции, как в первом примере, так что это, вероятно, очень плохая идея для начала. – transistor09

+0

Интересно, но это больше похоже на проблему дизайна. –

ответ

13

Я нахожу первый пример более таинственный ...

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

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

Две вещи, чтобы забрать здесь:

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

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

1

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

enter image description here

Программирование кода в машинописном-файл позволит вам увидеть типы переменных при наведении переменной.

enter image description here

Он также предупреждает вас, когда вы пытаетесь применить числовое-значение 10 переменной «а», который был первым объявлен функцией. Вот что я люблю машинопись, вы можете получить более подробную информацию об этом здесь: http://www.typescriptlang.org/

+0

Есть ли сообщение об ошибке с красной линией под назначением переменной? – Thilo

+2

встраивается изображение для вас – CupawnTae

+0

Спасибо @CupawnTae – CoderPi

1

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

0

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.

Смежные вопросы