javascript札記

也不知道以後會不會再補充

幫人借了本書,正好看了一隻沒搞明白的作用域一章,寫幾句


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,一直也沒搞明白,好像也是有什麼作用域鏈,啥時候有空整整明白



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章