0

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

4

2 回答 2

1

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

于 2013-02-21T05:51:08.587 回答
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);
}
于 2013-02-21T05:41:42.740 回答