Re: [ js ] 全域和區域變數
這種問題,最終標準是ECMA262
ECMA262裡面用兩個東西來定義處理變數的規則:execution context跟scope chain
ECMA262定義了三種execution context: global, eval, function
程式執行進入這三種code,執行環境就會為他建立各自的scope chain,變數解析會
沿著scope chain,從nested的函數由內往外找,最外面就是global
用var可以在任何地方宣告一個變數,宣告在函數內就是函數內的區域變數,宣告在
global就是global變數
沒有使用var宣告變數時,執行環境會先在本地找,找不到就沿著scope chain一路找
到了global還沒找到時,執行環境就會在global建立這個變數,把他assign為undefined
如果變數右側又assign一個值,他就不是undefined了,所以接下來使用不會有錯誤
訊息
以下程式在nested的函數內未宣告,但是在外層的函數宣告了,所以就算沒有var,
也不會變成global變數
function test() {
var testme = "test me please.";
function shout() {
testme = "shout: " + testme;
alert(testme);
}
shout();
}
test();
alert(testme);//在ff出現testme is not defined.錯誤訊息
如果把test()第一行的var拿掉,最後的alert(testme);就不會出現錯誤
所謂的global與區域,就是這麼回事
不要用其他語言的概念來看javascript,容易產生誤會。用三個概念來概括比較
不會出錯:
lexcical scope->所以可以做出closure
dynamic type->讓你可以用=隨便assign
prototype inheritance->用prototype來維護繼承(其實用assign就可以,但是不容
易維護)
其實javascript還是一個具備函數語言能力的語言,不多說了。
--
Sapere Aude! 這就是啟蒙運動的口號!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 60.250.95.16
推
06/19 10:44, , 1F
06/19 10:44, 1F
推
06/19 12:54, , 2F
06/19 12:54, 2F
推
06/19 16:12, , 3F
06/19 16:12, 3F
推
07/30 01:04, , 4F
07/30 01:04, 4F
討論串 (同標題文章)