2013-02-21 2 views
0

Итак, я читаю это article о JavaScript Лексический обзор, и автор указывает, что «JavaScript не является действительно статическим». Затем он «доказывает» это в следующем примере:Означает ли этот пример, что JavaScript не является полностью статическим?

var count = 5; 

function tellCount() { 
    console.log(count); 
}; 
tellCount(); //prints 5 
count = 7; 
tellCount(); //prints 7; 

Что мне здесь не хватает? Он поместил переменную count в глобальное пространство имен как пять, вызывает метод, который ссылается на глобальную переменную и печатает пять, затем изменяет глобальную переменную на семь и снова вызывает метод. Если я не ошибаюсь, изменение глобальной переменной и повторное вызов метода, использующего переменную, сделают это на любом языке с статическими областями.

Действительно ли автор доказывает, что JavaScript не является действительно статическим?

Примечание: Я знаю, что eval в JavaScript вводит форму динамического объема в JS, но меня больше интересует доказательство/опровержение того, что написал этот автор.

+1

См. Http://stackoverflow.com/questions/958983/are-variables-static-or-dynamically-scoped-in-javascript – jfriend00

+0

Я думаю, что автор путается между областью видимости и значением переменных. В примерах не отображается изменяющаяся область видимости, только значение переменных в этой области может меняться и что переменные могут находиться в нескольких цепочках цепочки. – RobG

ответ

1

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

0

Я думаю, что это плохой пример. Следующий пример статьи показывает более эффективный механизм ссылок:

var numbers = [1, 2, 3, 4, 5]; 
for (var i in numbers) { 
    var num = numbers[i]; 
    var anchor = document.createElement('A'); 
    anchor.setAttribute('href', '#'); 
    anchor.appendChild(document.createTextNode(num)); 
    document.body.appendChild(anchor); 

    anchor.addEventListener('click', function(event) { 
     alert('My number is ' + num); 
     event.preventDefault(); 
    }, false); 
} 
Смежные вопросы