也不知道以後會不會再補充
幫人借了本書,正好看了一隻沒搞明白的作用域一章,寫幾句
javascript沒有C等語言的塊作用域,真是個神奇的特性,也就是說{}完全不限制作用域
就我所看到的,只有定義函數纔會對變量的作用域有影響
另外還有一個神奇的事情,不多說,直接上例子
var gscope=’hello';
function f(){
alert(gscope);
var gscope;
gscope = ‘world’;
}
f();
以上代碼打出的是undefined,因爲進入f()以後,gscope已經變成本地的那個變量了
javascript的變量名deference的過程:
解釋器維護了一個作用域鏈,從上往下是全局對象的上下文,然後依次是調用的函數的調用對象(call object)
類似java的call stack順序
以上的裏子就是 f()的cb->全局對象
也就是現在f的cb裏找gscope,沒找到的話在全局對象裏找
不幸的是找到了,而且還是未定義!
這個邏輯打亂了以前的編譯語言的思維慣性
在於javascript允許在聲明前使用變量,不聲明的話默認爲全局變量,不管行文順序,只找作用域鏈!
(找到最後沒找到的話,如果是賦值語句,就加到全局對象的屬性中,不然就報錯,ms是這樣,爲考證,摘自javascript權威指南)
之前看了一些python,一直也沒搞明白,好像也是有什麼作用域鏈,啥時候有空整整明白