所以我正在阅读这篇关于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);
}