这个例子证明JavaScript不是真正的静态作用域吗?

时间:2013-02-21 05:13:49

标签: javascript

所以我正在阅读关于JavaScript Lexical范围的article,并且作者指出“JavaScript并不是真正的静态”。然后他通过以下例子“证明”这个:

var count = 5;

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

我在这里缺少什么?他将count变量放在全局命名空间中为5,调用引用全局变量的方法并打印5,然后将全局变量更改为7并再次调用该方法。如果我没有弄错,更改全局变量并重新调用使用该变量的方法将以任何静态范围的语言执行此操作。

作者是否真的证明JavaScript不是真正的静态范围?

注意:我知道JavaScript中的eval在JS中引入了一种动态范围,但我更感兴趣的是证明/反驳了这位作者写的内容。

2 个答案:

答案 0 :(得分:1)

你没有遗漏任何东西而且作者错了。词法范围意味着闭包可以访问定义函数中的变量,而不是在定义闭包时神奇地复制它。

答案 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);
}