这个例子是否证明了JavaScript并不是真正的静态作用域



所以我正在阅读这篇关于JavaScript词汇范围的文章,作者指出"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中引入了一种动态范围的形式,但我更感兴趣的是证明/反驳这位作者所写的内容。

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

我认为这是一个糟糕的例子。文章的下一个例子展示了更有效的参考机制:

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

最新更新