嚴格模式use strict

JavaScript是一個弱類型語言,這其實跟JavaScript建立之初有關係。當時JavaScript的做者只是隨便寫一個語言來臨時使用,鬼知道JavaScript會在今天這麼有地位。瀏覽器

有業界大牛說JavaScript是如今開發語言裏面最差的,不能否認,越是約束少的語言,真正面對大型項目的時候越是容易出現問題。其實JavaScript有不少不合理不嚴謹甚至是糟糕的機制。好比沒有做用域、重複聲明變量、可選的分號等等,都是被人詬病地方。安全

隨着JavaScript應用的愈來愈多,ECMAScript慢慢的也定製了一些標準來改進JavaScript的缺陷,好比ES6的let、const、module、class等。而早在ES5就提出了第二種運行模式嚴格模式,就是但願開發者能慢慢的脫離馬虎模式/稀鬆模式/懶散模式(sloppy)模式。函數

嚴格模式的目的:優化

消除JavaScript語法不合理不嚴謹的地方,減小奇怪的行爲。this

消除代碼運行不安全的地方。cdn

提升編譯效率和運行速度。對象

爲將來作鋪墊。ip

嚴格模式IE10以上和各大瀏覽器都已經支持,要注意的是,相同代碼在嚴格模式和非嚴格模式下運行獲得的結果會有不一樣。主要仍是增長了不少靜默拋出異常。作用域

使用:"use strict"開發

能夠在整個js開頭聲明,也能夠在函數裏面聲明:

或者:

function fn() {

"use strict";

}

嚴格模式下的改進:

沒有聲明a,直接a = 10報錯,這意味着拼寫錯誤的變量直接報錯。

對只讀屬性、getter屬性賦值,對禁止擴展的對象添加新屬性,刪除不可刪除的屬性都會拋出異常。

對象有重名屬性、函數參數重名,正常是後面覆蓋以前的,嚴格模式下是語法錯誤、會報錯。

禁止了八進制表示法

ECMAScript 6中的嚴格模式禁止設置primitive值的屬性.不採用嚴格模式,設置屬性將會簡單忽略(no-op),採用嚴格模式,將拋出TypeError錯誤。這個我還真不理解。

嚴格模式簡化了代碼中變量名字映射到變量定義的方式,JavaScript有些狀況會使得代碼中名字到變量定義的基本映射只在運行時才產生. 嚴格模式移除了大多數這種狀況的發生, 因此編譯器能夠更好的優化嚴格模式的代碼:

禁止使用with:

with所引發的問題是塊內的任何名稱能夠映射(map)到with傳進來的對象的屬性, 也能夠映射到包圍這個塊的做用域內的變量(甚至是全局變量), 這一切都是在運行時決定的: 在代碼運行以前是沒法得知的。

建立eval做用域:

在正常模式下, 代碼 eval("var x;") 會給上層函數或者全局引入一個新的變量 x 。這意味着, 通常狀況下, 在一個包含 eval 調用的函數內全部沒有引用到參數或者局部變量的名稱都必須在運行時才能被映射到特定的定義 (由於 eval 可能引入的新變量會覆蓋它的外層變量)。在嚴格模式下 eval 僅僅爲被運行的代碼建立變量, 因此 eval 不會使得名稱映射到外部變量或者其餘局部變量。

沒法刪除變量。只有configurable設置爲true的對象屬性,才能被刪除。

var a = 10;

delete a;//報錯

嚴格模式下更容易寫出「安全」的JavaScript

禁止this執行全局對象:

function fn() {

"use strict";

console.log(this);}

fn()//undefinednew fn()指向window

禁止函數內部遍歷調用棧:

function fn() {

"use strict";

console.log(fn.arguments);

console.log(fn.caller);

}

fn()//報錯

Arguments不能賦值,也不會追蹤參數變化:

function fn(a) {

a = 20;

console.log(arguments[0]);

}

fn(10)

嚴格模式輸出10,非嚴格模式輸出20。

嚴格模式下的arguments不會再提供訪問與調用這個函數相關的變量的途徑,也就是禁用arguments.callee

函數聲明必須在頂層,也就是說只能在全局或者函數做用域內聲明函數,在if或者for循環裏面不能聲明函數,不然報錯。

爲將來的ECMAScript版本鋪平道路,增長了一些保留字,也就是不能用來聲明變量的關鍵字,不能再用這些名字做爲變量名或者形參名:

implements, interface, let, package, private, protected, public, static, yield,class, enum, export, extends, import, super等

相關文章
相關標籤/搜索