Re: [ js ] 全域和區域變數

看板Ajax作者 (冒牌費大公)時間16年前 (2008/06/19 10:43), 編輯推噓4(400)
留言4則, 4人參與, 最新討論串5/5 (看更多)
這種問題,最終標準是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
文章代碼(AID): #18MSV4AS (Ajax)
文章代碼(AID): #18MSV4AS (Ajax)