關於JavaScriptya‘use strict’的使用
阿新 • • 發佈:2019-02-17
1.什麼是嚴格模式?
ECMAScript 5包括兩種執行模式:正常模式和嚴格模式。嚴格模式,‘use strict’,是的JavaScript在更嚴格的條件下執行。2.為什麼使用嚴格模式?
1)消除JavaScript語法一些不嚴謹不合理的地方,減少怪異行為,更方便小白查詢bug。
2)提高編譯效率,增加執行速度。
3)提高了安全性。
4)適用於大型專案開發。
3.如何使用嚴格模式?
'use strict';
4.你能用嚴格模式做什麼?
1)正常模式,如果一個變數沒有宣告就賦值,預設是全域性變數。嚴格模式禁止該用法,全域性變數必須使用var顯式宣告再使用。
2)JavaScript 語言的一個特點,就是允許"動態繫結",即某些屬性和方法到底屬於哪一個物件,不是在編譯時確定的,而是在執行時(run time)確定的。 嚴格模式對動態繫結做了一些限制。某些情況下,只允許靜態繫結。也就是說,屬性和方法到底歸屬哪個物件,在編譯階段就確定。這樣做有利於編譯效率的提高,也使得程式碼更容易閱讀,更少出現意外。
3)增強安全性。
- 禁止使用this關鍵字指向全域性物件
使用建構函式時,如果忘記加new,this不指向全域性物件而是報錯。function f(){ return !this; } // 返回false,因為"this"指向全域性物件,"!this"就是false function f(){ "use strict"; return !this; } // 返回true,因為嚴格模式下,this的值為undefined,所以"!this"為true。
function f(){ "use strict"; this.a = 1; }; f();// 報錯,this未定義
- 禁止函式內部遍歷呼叫棧
function f1(){ "use strict"; f1.caller; // 報錯 f1.arguments; // 報錯 } f1();
- 禁止刪除變數
"use strict"; var x; delete x; // 語法錯誤 var o = Object.create(null, {'x': { value: 1, configurable: true }}); delete o.x; // 刪除成功
- 顯式報錯 正常模式下,對一個物件的只讀屬性進行賦值,不會報錯,只會默默失敗。嚴格模式,將報錯。
嚴格模式下,對一個使用getter方法讀取的屬性進行賦值,會報錯。"use strict"; var o = {}; Object.defineProperty(o, "v", { value: 1, writable: false }); o.v = 2; // 報錯
嚴格模式下,對禁止擴充套件的物件新增新屬性,會報錯。'use strict'; var o={ get v() {return 1;} }; o.v=2 ;//報錯
"use strict"; var o = {}; Object.preventExtensions(o); o.v = 1; // 報錯
嚴格模式下,刪除一個不可刪除的屬性會報錯。"use strict"; delete Object.prototype; // 報錯
- 重名錯誤 1) 物件不能有重名的屬性,正常模式下,如果物件有多個重名的屬性,後面覆蓋前面的值。嚴格模式,屬於語法錯誤
2)函式不能有重名引數 正常模式下,若函式有多個重名引數,可以用arguments[i]讀取。嚴格模式,屬於語法錯誤。"use strict"; var o = { p: 1, p: 2 }; // 語法錯誤
"use strict"; function f(a, a, b) { // 語法錯誤 return ; }
- 禁止八進位制表示法 正常模式,整數的第一位若為0,表示這是八進位制數,如0100等於十進位制64.嚴格模式禁止這種表示法。
"use strict"; var n = 0100; // 語法錯誤
- 函式宣告必須在頂層 嚴格模式只允許在全域性作用域或函式作用域的頂層宣告函式。不允許在非函式的程式碼塊內宣告函式。
'use strict' if(true){ function f(){}//語法錯誤 } for (var i=0;i<5;i++){ function f2(){}//語法錯誤 }
-
新增保留字:implements,interface,let,package,private,protected,public,static,yield.使用這些詞作為變數名會報錯。此外,ECMAScript 第五版本身還規定了另一些保留字(class, enum, export, extends, import, super),以及各大瀏覽器自行增加的const保留字,也是不能作為變數名的
function package(protected) { // 語法錯誤 "use strict"; var implements; // 語法錯誤 }