使用方式:'use strict';
- 爲某個script標籤開啓嚴格模式
- 爲某個函數開啓嚴格模式
嚴格模式有哪些不同呢
- 將拼寫錯轉成異常
- 未聲明的變量不能賦值。可以防止意外創建全局變量。
- 嚴格模式會使引起靜默失敗(silently fail,注:不報錯也沒有任何效果)的賦值操拋出異常. 例如, NaN 是一個不可寫的全局變量. 在正常模式下, 給 NaN 賦值不會產生任何作用; 開發者也不會受到任何錯誤反饋. 但在嚴格模式下, 給 NaN 賦值會拋出一個異常. 任何在正常模式下引起靜默失敗的賦值操作 (給不可寫屬性賦值, 給只讀屬性(getter-only)賦值賦值, 給不可擴展對象(non-extensible object)的新屬性賦值) 都會拋出異常。
- 在嚴格模式下, 試圖刪除不可刪除的屬性時會拋出異常(之前這種操作不會產生任何效果)。
- 重名屬性,SyntaxError。
- 重名參數,SyntaxError。
- 進制八進制數字語法。
- 進製爲原始值設置屬性,TypeError。
- 簡化變量使用
- 禁用with
- eval不再爲上層範圍引入新變量
- 嚴格模式禁止刪除聲明變量
- 讓eval和arguments變得簡單
- 名稱 eval 和 arguments 不能通過程序語法被綁定(be bound)或賦值. (成爲了關鍵字)
- 參數的值不會隨 arguments 對象的值的改變而變化。函數的 arguments 對象會保存函數被調用時的原始參數。
- 不再支持 arguments.callee。
安全的Javascript
- fun.caller和fun.arguments不再使用
- arguments.callee
- 函數單獨調用時this不默認指向window,用bind綁定this時不進行包裝。
"use strict";
function fun() { return this; }
console.assert(fun() === undefined);//true
console.assert(fun.call(2) === 2);//true
console.assert(fun.apply(null) === null);//true,正常模式下返回window
console.assert(fun.call(undefined) === undefined);//true,正常模式下返回window
console.assert(fun.bind(true)() === true);//true
爲未來的ECMAScript版本鋪平道路
- 一部分字符變成了保留的關鍵字。這些字符包括implements, interface, let, package, private, protected, public, static和yield。在嚴格模式下,你不能再用這些名字作爲變量名或者形參名。
- 嚴格模式禁止了不在腳本或者函數層面上的函數聲明。(在if和for中不能聲明函數)
Mozilla MDN