二十四、js嚴格模式(Use Strict)
1."use strict";
定義 JavaScript 代碼應該以“嚴格模式”執行。是 JavaScript 1.8.5 中的新指令(ECMAScript version 5)。"use strict";
的作用是指示 JavaScript 代碼應該以“嚴格模式”執行。
2. 聲明嚴格模式
通過在腳本或函數的開頭添加 "use strict";
來聲明嚴格模式。
"use strict"
指令只能在腳本或函數的開頭被識別。
3. 在嚴格模式中,向不可寫的、只能讀取的、不存在的屬性賦值,或者向不存在的變量或對象賦值,將拋出錯誤
4. 嚴格模式中不允許的事項
(1)在不聲明變量的情況下使用變量,是不允許的:
"use strict";
x = 3.14; // 這將引發錯誤
(2)在不聲明對象的情況下使用對象也是不允許的:
"use strict";
x = {p1:10, p2:20}; // 這將引發錯誤
(3)刪除變量(或對象)是不允許的:
"use strict";
var x = 3.14;
delete x; // 這將引發錯誤
(4)刪除函數是不允許的:
"use strict";
function x(p1, p2) {};
delete x; // 這將引發錯誤
(5)重複參數名是不允許的:
"use strict";
function x(p1, p1) {}; // 這將引發錯誤
(6)八進制數值文本是不允許的:
"use strict";
var x = 010; // 這將引發錯誤
(7)寫入只讀屬性是不允許的:
"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14; // 這將引發錯誤
Object.defineProperty()的作用就是直接在一個對象上定義一個新屬性,或者修改一個已經存在的屬性。writable:false表示obj對象的x屬性爲只讀
Object.defineProperty(obj, prop, desc)
·obj 需要定義屬性的當前對象
·prop 當前需要定義的屬性名
·desc 屬性描述符:
數據屬性(數據描述符): Configurable:能否通過 delete 刪除屬性,能否修改屬性的特性,或者能否把屬性修改爲訪問器屬性。
Enumerable:能否通過 for ·· in 或者 Object.key() 枚舉。 Writable:屬性的值能否被修改。
Value:屬性的值,可以是任何有效的 JavaScript 值(數值,對象,函數等) 訪問器屬性(存取描述符):
Get:在讀取屬性時調用的函數。 Set:在寫入屬性時調用的函數。
(8)寫入只能獲取的屬性是不允許的:
"use strict";
var obj = {get x() {return 0} };
obj.x = 3.14; // 這將引發錯誤
(9)刪除不可刪除的屬性是不允許的:
"use strict";
delete Object.prototype; // 這將引發錯誤
(10)字符串 “eval” "arguments"等保留字不可用作變量:
"use strict";
var eval = 3.14; // 這將引發錯誤
(11)with 語句是不允許的:
"use strict";
with (Math){x = cos(2)}; // 這將引發錯誤
(12)處於安全考慮,不允許 eval() 在其被調用的作用域中創建變量:
"use strict";
eval ("var x = 2");
alert (x); // 這將引發錯誤
(13)在類似 f() 的函數調用中,this 的值是全局對象。在嚴格模式中,現在它成爲了 undefined。
(14)嚴格模式中不允許使用爲未來預留的關鍵詞。它們是:
• implements
• interface
• let
• package
• private
• protected
• public
• static
• yield