嚴格模式use strict

wade3po發表於2019-04-15

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

有業界大牛說JavaScript是現在開發語言裡面最差的,不可否認,越是約束少的語言,真正面對大型專案的時候越是容易出現問題。其實JavaScript有很多不合理不嚴謹甚至是糟糕的機制。比如沒有作用域、重複宣告變數、可選的分號等等,都是被人詬病地方。

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

嚴格模式的目的:

消除JavaScript語法不合理不嚴謹的地方,減少奇怪的行為。

消除程式碼執行不安全的地方。

提高編譯效率和執行速度。

為未來做鋪墊。

嚴格模式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等

嚴格模式use strict

相關文章