2013-02-21 29 views
0

因此,我正在閱讀關於JavaScript詞法範圍的article,作者指出「JavaScript並非真正的靜態」。然後,他通過以下示例「證明」:這個例子證明JavaScript沒有真正的靜態範圍嗎?

var count = 5; 

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

我在這裏錯過了什麼?他將count變量放在全局名稱空間中,調用引用全局變量並打印5的方法,然後將全局變量更改爲7,然後再次調用該方法。如果我沒有弄錯,更改一個全局變量並重新調用一個使用該變量的方法可以在任何靜態範圍的語言中執行此操作。

作者是否真的證明JavaScript不是真正的靜態範圍?

注意:我知道JavaScript中的eval向JS引入了一種動態範圍,但我更感興趣的是證明/反駁這位作者寫的東西。

+1

請參閱:http://stackoverflow.com/questions/958983/are-variables-statically-or-dynamically-scoped-in-javascript – jfriend00 2013-02-21 05:38:10

+0

我認爲作者混淆了作用域和如何賦值給變量。這些示例沒有顯示範圍的變化,只是該範圍內的變量的值可能會更改,並且該變量可能位於多個範圍鏈中。 – RobG 2013-02-21 05:50:17

回答

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); 
} 
相關問題