天天看點

JavaScript嚴格模式

"use strict" 指令在 JavaScript 1.8.5 (ECMAScript5) 中新增。它不是一條語句,但是是一個字面量表達式,在 JavaScript 舊版本中會被忽略。"use strict" 的目的是指定代碼在嚴格條件下執行。嚴格模式下你不能使用未聲明的變量。

嚴格模式通過在腳本或函數的頭部添加 "use strict"; 表達式來聲明。大家可以通過浏覽器的F12來檢視。

JavaScript嚴格模式

例如我們使用下面的寫法是會報錯的

在函數内部聲明是局部作用域 (隻在函數内使用嚴格模式)是不報錯的。

說到這裡,我們采用嚴格模式有什麼作用呢?總結一下主要有以下幾點:

- 消除Javascript文法的一些不合理、不嚴謹之處,減少一些怪異行為;

- 消除代碼運作的一些不安全之處,保證代碼運作的安全;

- 提高編譯器效率,增加運作速度;

- 為未來新版本的Javascript做好鋪墊。

嚴格模式使用标志,将"use strict"放在腳本檔案的第一行,則整個腳本都将以"嚴格模式"運作。如果這行語句不在第一行,則無效,整個腳本以"正常模式"運作。

嚴格模式調用有兩種方式,

針對單個函數調用,

腳本的變通寫法

Javascript語言的一個特點,就是允許"動态綁定",即某些屬性和方法到底屬于哪一個對象,不是在編譯時确定的,而是在運作時(runtime)确定的。嚴格模式對動态綁定做了一些限制。某些情況下,隻允許靜态綁定。也就是說,屬性和方法到底歸屬哪個對象,在編譯階段就确定。基于上面的文法特點,

因為with語句無法在編譯時就确定,屬性到底歸屬哪個對象。

正常模式下,Javascript語言有兩種變量作用域(scope):全局作用域和函數作用域。嚴格模式創設了第三種作用域:eval作用域。

正常模式下,eval語句的作用域,取決于它處于全局作用域,還是處于函數作用域。嚴格模式下,eval語句本身就是一個作用域,不再能夠生成全局變量了,它所生成的變量隻能用于eval内部。

禁止this關鍵字指向全局對象

使用構造函數時,如果忘了加new,this不再指向全局對象,而是報錯

禁止在函數内部周遊調用棧

禁止删除變量

函數必須聲明在頂層

将來Javascript的新版本會引入"塊級作用域"。為了與新版本接軌,嚴格模式隻允許在全局作用域或函數作用域的頂層聲明函數。也就是說,不允許在非函數的代碼塊内聲明函數。

禁止使用arguments.callee

無法再匿名内部調用本身了

好了,對于JavaScript 6的嚴格模式就講這麼多了,有興趣的歡迎加群(278792776)。

繼續閱讀