2013-08-01 2 views
4

1-й тест:Как понять глобальные и локальные переменные в JavaScript

var a = 1; 
function b() { 
    a = 10; 
    return; 
    function a() {} 
} 
b(); 
alert(a); // 1 

второй тест:

var a = 1; 
function b() { 
    a = 10; 
    return; 
} 
b(); 
alert(a); // 10 

В первом тесте, a равно 1, хотя я поставил его 10 в метод. Во втором тесте я установил его на 10, и он установлен на 10, когда я его выводю. Как это работает?

+0

Этот пример и его пояснения приведены здесь: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html –

ответ

2

объявление функции function a() {} объявляет имя переменной a в локальной области видимости вашего b функции (и присваивает ей функцию). Когда вы назначаете a, вы назначаете эту локальную переменную не глобальную.

грузоподъемными применяется, ваш код эквивалентен

var b = function b() { 
    var a = function a() {}; 
    a = 10; 
    return; 
} 
var a = 1; 
b(); 
alert(a); // 1, obvious now 
2

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

+0

Я вижу. Довольно сложно. Спасибо за ваш быстрый ответ. –

0

В своем первом тесте, вы создаете функцию, которая хранится в местной переменной a:

function b() { 
    a = 10; 
    return; 
    function a() {} // can be called using a() inside this function 
} 

Таким образом, вы могли бы назвать эту функцию с помощью a() внутри функции b(). Попытка:

function b() { 
    a(); // alerts "hi" 
    a = 10; 
    return; 
    function a() { alert("hi"); } 
} 

Теперь вы сохраняете в локальной переменной число 10 вместо функции. Глобальная переменная остается неизменной, поэтому ваш внешний сигнал тревоги все еще показывает 1.

0

Первый пример интерпретируется (по JavaScript) как:

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

В JavaScript, все локальные переменные (в данном случае местный переменная a, которая будет удерживать функцию) объявляются в верхней части функции.

Локальная переменная a устанавливается равной 10, а не глобальной. Затем он прекращает свое существование после возвращения.

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