2013年7月28日 星期日

那些年 我們誤會很深的 Javascript 變數作用域

自從上次學會第一次惹惱隊友就上手 以 JSHint 為例之後

其中有話這麼說:請注意這貨十分殘暴 在惹惱隊友 會先惹惱自己

毫無疑外馬上就中槍





故事是這麼發生的

身為一個 C# 嫻熟的 PG 這段 Foo 是用來表示奇偶數的 很合理吧

正如我剛才所說 身為一個 C# 嫻熟的 PG 把剛剛的 Foo 用 JS 翻寫成這樣 也很合邏輯

說時遲那時快杰哥 JSHint 來了





花了發科 為啥這樣寫是錯的 從古至今一路走來 都這樣寫 難到小弟我錯了嗎?

stackoverflow教教你:http://stackoverflow.com/questions/810313/what-is-the-reason-behind-jslint-saying-there-are-too-many-var-statements





原來 Javascript 是沒有 block scope 的

也就是說 只要在同一個 function 裡面的變數

不管是在 if for while 還是蝦米小 的 block 之中

都能在外部存取變數

也就是說 以這個案例來看 即便離開 for 迴圈 下面仍然抓的到 result 甚至 loop 用的 i 變數

而 Javascript 變數的作用域 唯一的分水嶺 在於這個 var

沒有宣告 var 的變數 會是全域變數 全世界都抓的到他

有宣告 var 的變數 只有在該 function 內可以使用

但是 只要是在 function 內 是無視任何 block 的

所以 JSHint 認為 明明這些變數 並非具有 block scope 約束 但是卻以相似的方式撰寫 是一種誤導行為 所以他不允許





最後 依照 JSHint 拉比法典 的規則 必須寫成這樣 只有 一個 var 且最好在 function 最上面 避免他說 我們在宣告前就使用變數

但是老實說 即使是之前的寫法 程式真的會因此出錯嗎 或者在維護上 會讓人搞不清楚嗎 那也不見得

老話一句 工具幫助我們檢查細節 但是 是否要 100% 服從 我想就看誰是杰哥了

1 則留言:

  1. 用 let 反制他
    https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Statements/let

    回覆刪除