JavaScript被設計爲能使新人開發者更易於上手, 所以有時候會給本來錯誤操作賦予新的不報錯誤的語義(non-error semantics). 有時候這可以解決當前的問題, 但有時候卻會給以後留下更大的問題. 嚴格模式則把這些失誤當成錯誤, 以便可以發現並立即將其改正.
開啓嚴格模式
在需要開啓嚴格模式的函數或者文本中傳入特定語句'use strict'
(或者"use strict"
)即可開啓嚴格模式
- 爲整個腳本開啓
'use strict' var strict='I am a strict mode';
- 爲函數開啓
function strict(){ 'use strict' console.log('I am a strict mode function'); }
嚴格模式的變化
一、無法意外創建全局變量,利用拋出錯誤代替,普通JavaScript中會創建並繼續執行:
'use strict'
avaliable=3
console.log(avalible)
運行上述代碼,控制檯拋出錯誤
Uncaught ReferenceError: avaliable is not defined
普通模式則創建,並打印
二、引起靜默失敗(不報錯也不產生效果的錯誤),在普通模式下會不處理,但是在嚴格模式下會拋出錯誤,例如 undefined 是全局中的一個變量,在普通模式下給undefined賦值,不會產生錯誤,也不會對改變undefined的值
//'use strict'
undefined=3
console.log(undefined)//控制檯打印undefined
使用嚴格模式,控制檯拋出錯誤
Uncaught TypeError: Cannot assign to read only property ‘undefined’ of object ‘#’
三、嚴格模式下試圖刪除不可刪除屬性時拋出錯誤
在JavaScript 中,delete 用於刪除對象中的某個屬性值,其返回值均爲 True 當刪除屬性爲不可刪除屬性時,非嚴格模式返回false ,嚴格模式拋出錯誤
'use strict'//不使用不報錯
delete Object.prototype;
//拋出錯誤
//test.html:14 Uncaught TypeError: Cannot delete property 'prototype' of function Object() //{ [native code] }
四、要求函數參數名唯一,在普通模式,函數參數名存在兩個時,後邊個會覆蓋前邊個變量,但是嚴格模式下被認爲爲意料之外的情況(例如寫錯)拋出錯誤
// 'use strict'
function sum(a,a,b){
console.log(a+a+b)
}
sum(1,2,3)//非嚴格模式打印7 2+2+3
使用嚴格模式,拋出錯誤
Uncaught SyntaxError: Duplicate parameter name not allowed in this context
瀏覽器的嚴格模式
主流瀏覽器都支持嚴格模式,但是仍有一部分瀏覽器不支持,嚴格模式改變了語義,在使用時需注意兼容性問題。