JavaScript 嚴格模式


JavaScript被設計爲能使新人開發者更易於上手, 所以有時候會給本來錯誤操作賦予新的不報錯誤的語義(non-error semantics). 有時候這可以解決當前的問題, 但有時候卻會給以後留下更大的問題. 嚴格模式則把這些失誤當成錯誤, 以便可以發現並立即將其改正.

開啓嚴格模式

在需要開啓嚴格模式的函數或者文本中傳入特定語句'use strict'(或者"use strict")即可開啓嚴格模式

  1. 爲整個腳本開啓
    'use strict'
    var strict='I am a strict mode';
    
  2. 爲函數開啓
    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

瀏覽器的嚴格模式

主流瀏覽器都支持嚴格模式,但是仍有一部分瀏覽器不支持,嚴格模式改變了語義,在使用時需注意兼容性問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章