養成一個好習慣:在嚴格模式下開發Javascript

  前言數組

    坦白說對於Javascript所謂的嚴格模式在今年早些時候我還一無所知,真正在開發中應用也就幾個月.對於這個ECMAScript5就已經引入的東西,已經不能算新了,對於這個東西一直處在字面的理解上,就是"更加嚴格,規範的限制Javscript代碼的書寫",今天打算結合使用的經驗好好研究下它究竟是怎麼回事.瀏覽器

  正文函數

    Javascript中若是你想你的代碼在嚴格模式下運行,很是簡單,只要在代碼的第一行,也就是首行加上"use strict"指令便可.對於那些不支持ECMAScript5的瀏覽器來講它沒有任何影響,因此若是想它生效要肯定一下你的瀏覽器,不是全部瀏覽器都支持,畢竟咱們給力的國情決定IE仍是市場主力,IE10一下的同窗要注意了.
this

    使用"use strict"能給開發帶來什麼好處?
編碼

    其實若是你一直在Chrome環境下開發,而且代碼書寫算規範,那麼你幾乎不會感受到有任何變化.可是確實有一些顯而易見的好處,我也從中受益因此和你們分享一下.
spa


    (1) 錯誤提示更加準確
code

    Javascript的錯誤提示一直是個比較傷心的問題,鬆散的語言結構在賦予格外靈活的同時也讓他像調皮的孩子同樣難以管教.在Javascript應用愈來愈重的今天,這會明顯拖延咱們的開發進度,影響開發的感受.
對象

    "use strict"模式下能夠更加明確的提示你的代碼出了什麼樣的錯誤,這讓你能夠更加快速而且專一的去解決問題.
ip


    (2) 變量必須聲明
作用域

    在非嚴格模式若是你沒有聲明一個變量就使用它,那麼它會被當作一個全局變量,在嚴格模式下則報錯並拋出異常.我一直認爲先聲明後使用是一個好習慣,而且一直堅持.


    (3) 屬性或者參數再也不可重複

    雖然沒有寫過,不過我確實看過相似的代碼:

var a = {
  aaa: 'dddddd',
  bbb: 'dddddd',
  aaa: 'cccccc'
}

    雖然不算是驚呆了,不過我就想問,哥們你是從CSS轉到JS的嗎...屬性覆蓋都來了.在非嚴格模式下這樣書寫可能不會報錯,若是你用"use strict"那麼抱歉,瀏覽器會拋出異常.


    (4) with被禁用

    這個雖然是一個重要的改變,至關於API層次的禁用,不過貌似平常編碼中咱們使用with的時候並很少,因此影響不大


    (5) Function中this再也不是window

    這一點算是嚴格模式下的一個很嚴謹的地方,常常在調用的函數中咱們用this指向window這類全局變量.可是在嚴格模式下,這樣的this的值是undefined.


    (6) 變量刪除

    相比較與屬性刪除咱們可能不多或者幾乎不會去進行變量刪除的操做,在嚴格模式下變量的刪除是不容許的.而對於屬性的刪除,只有configurable設爲true的屬性才能被刪除.

"use strict";
  var x;
  delete x; // 語法錯誤
  var o = Object.create(null, 'x', {
      value: 1,
      configurable: true
  });
  delete o.x; // 刪除成功

    

    (7) 函數聲明只能在頂層

    這個改變很是可能對舊有的代碼或者本來書寫就不規範的代碼形成影響,之前咱們定義function能夠說是爲所欲爲,無論在if仍是for中,都是想怎麼樣就怎麼樣.

    在"use strict"模式下,爲了與之後ECMAScript6接軌,規定了函數的聲明只能在全局做用域或者函數做用域的頂層進行聲明.


    (8) arguments對象再也不神奇

    在嚴格模式中,函數裏的arguments對象擁有傳入函數值的靜態副本.而在非嚴格模式下,arguments對象的數組元素和函數參數都指向同一個值的引用.這種限制會使得不少神奇的代碼再也不可用.


  結論:

    上面這幾點是我感受使用了"use strict"後變化最大的地方,另外須要注意"use strict"的使用也是有風險的,並非萬金油.尤爲是在舊有的項目中,若是想使用嚴格模式要很是謹慎,一旦你在文件首行加入了"use strict"那麼整個文件都會受到這個限制,若是你合併全部文件,這一點要格外注意.

    固然你也能夠靈活的使用"use strict",好比在函數內部的首行,或者在匿名函數做用域的首行去使用.注意這裏之因此強調是首行,由於瀏覽器對於腳本代碼以及函數體中第一條常規語句後的內容都不會看成指令去解析,也就是說若是你的"use strict"寫在了var a=0;以後,那麼瀏覽器只會將其看成一個普通的表達式語句.

    最後,但願你們在開發時條件容許的狀況下儘可能使用"use strict"開發,它最大的好處就是幫助你更快的定位錯誤!詳細的提示信息讓你更好的糾錯.

相關文章
相關標籤/搜索