JavaScript嚴格模式use strict的介紹
1.概述
1.1嚴格模式是什麼
嚴格模式是JavaScript
中的一種限制性更強的變種方式。嚴格模式並不是JavaScript
中的子集,它在語義上與正常的代碼有明顯的差異。
雖然說現在大部分瀏覽器都已經支持嚴格模式,但是還是有部分老版本的瀏覽器不支持嚴格模式,所以不要在未經嚴格模式特性測試情況下使用嚴格模式。
JavaScript
中的嚴格模式與非嚴格模式可以共存,所以在腳本中可以選擇性的加入嚴格模式。
1.2嚴格模式的目的
使用嚴格模式的目的如下所示:
首先,嚴格模式會將JavaScript
陷阱直接變成明顯的錯誤。
其次,嚴格模式修正瞭一些引擎難以優化的錯誤:同樣的代碼有些時候嚴格模式會比非嚴格模式下更快。
嚴格模式禁用瞭一些可能在未來版本定義的語法。
2.開啟嚴格模式
JavaScript
中開啟嚴格模式分為兩種,分別是全局開啟嚴格模式和局部開啟嚴格模式。
2.1全局開啟嚴格模式
開啟全局嚴格模式隻需要在所有的代碼前面輸入一段字符串,字符串如下:
"use strict";//或者'use strict';
需要註意的是,如果之前的JavaScript
代碼是非嚴格模式的話,建立是不要為這段代碼開啟嚴格模式,這樣可能會出現問題。建議先從局部開啟嚴格模式,一步一步的調整代碼。
2.2局部開啟嚴格模式
局部開啟嚴格模式可以在某個指定的函數中的第一行加入”use strict
“;這段字符串,這個函數體外還是非嚴格模式。
開啟嚴格模式的實例代碼如下所示:
//全局開啟嚴格模式 //"use strict" v = 100 console.log(v) function fun() { //局部開啟嚴格模式 'use strict' vv = 200 console.log(vv) } // fun() 拋出異常 vv is not defined
3.嚴格模式中的變量
3.1禁止意外創建變量
所謂的意外創建變量就是指不使用var關鍵字聲明的變量。當在嚴格模式下,如果意外創建全局變量,將會拋出異常,
示例代碼如下所示:
'use strict' //在非嚴格模式下,這樣創建變量將不會報錯,但是在嚴格模式下這樣創建變量將會拋出異常 v = 100 console.log(v)
3.2靜默失敗轉為異常
所謂靜默失敗就是既不報錯也沒有任何效果,在嚴格模式下將會轉為異常。
3.3禁用delete關鍵字
在非嚴格模式下,對全局變量使用delete關鍵字將會出現靜默失敗,而在嚴格模式下,將會拋出異常,示例代碼如下所示
'use strict' var v = 100 delete v // SyntaxError:Deleteofanunqualifiedidentifierinstrictmode. console.log(v)
3.4對變量名的限制
在嚴格模式下,JavaScript
對變量名也有限制,特別是不能使用保留字作為變量名,使用保留字作為符作為變量名會導致語法錯誤。
4.嚴格模式中的對象
4.1不可刪除的屬性
在非嚴格模式下,對不可刪除的屬性使用delete
關鍵字將會出現靜默失敗,而在嚴格模式下,將會拋出異常。
示例代碼如下所示:
"use strict" delete Object.prototype;//拋出異常
4.2隻讀屬性的賦值
在非嚴格模式下,對一個隻讀的屬性進行賦值操將會靜默失敗,但是在嚴格模式下將會拋出異常,示例代碼如下:
'use strict' var obj = {} Object.defineProperty(obj, 'name', { value: '一碗粥', }) obj.name = '一碗周' //拋出異常
4.3不可擴展的對象
在非嚴格模式下,為不可擴展的對象添加新的屬性將會靜默失敗,而在嚴格模式下將會拋出異常。
示例代碼如下所示:
//開啟全局嚴格模式 'use strict' var obj = {} //將悐變成不可擴展的 Object.preventExtensions(obj) //為對象擴展屬性 obj.name = '一碗周' // 拋出異常
5.嚴格模式中的函數
5.1參數名必須唯一
在非嚴格模式下,函數的形參可以重復,但是在嚴格模式中,如果函數的形參重復將會拋出異常,示例代碼如下所示:
'use strict' function fun(a, a, b) { console.log(a + a + b) } /* *非嚴格模式下結果為7=2+2+3 *嚴格模式下將會拋出異常 */ fun(1, 2, 3)
5.2arguments的不同
在嚴格模式和非嚴格模式中,arguments
對象的行為是不同的
具體不同如下所示:
- 在非嚴格模式下,修改實參的值會也會反映到
arguments
對象中。 - 在嚴格模式下,命名參數與‘
arguments'
對象是完全獨立的。
示例代碼如下所示:
'use strict' function fun(v) { v = '100' console.log(v) console.log(arguments[0]) } /* *在非嚴格模式中打印的結果為100,100 *在嚴格模式中打印的結果為100,200 */ fun(200)
5.3arguments.callee屬性
在非嚴格模式中的可以使用arguments.callee
屬性,結果為當前函數名稱,而在嚴格模式中,使用此屬性將會拋出異常。
示例代碼如下:
'usestrict' functionfun(){ console.log(arguments.callee); } fun()//拋出異常
5.4函數聲明的限制
在嚴格模式下,隻能在全局作用域和局部作用域中聲明函數,除這兩種作用域外聲明函數語法是錯誤的(例如if語句塊)。
示例代碼如下所示:
'use strict' function fun() { console.log(arguments.callee) } fun() //拋出異常
6.增加eval()作用域
在嚴格模式下,使用eval()
函數創建的變量隻能在函數內部使用。
在外部使用將會拋出異常,示例代碼如下:
'use strict' eval('var v=100') console.log(v) //拋出異常
7.抑制this
在非嚴格模式下使用Fucntion
的apply()
或者call()
方法時,null
或者undefined
值會被轉換為全局對象。而嚴格模式下,函數的this
值始終是指定的值。
示例代碼如下所示:
//開啟嚴格模式 'use strict' var v = 100 function fn() { console.log(this.v) } var obj = { v: 200, } fn.call(obj) //this指向全局對象
結語:
本篇文章基本將嚴格模式的所有情況大致都有所介紹,解決日常開發中關於嚴格模式的問題足以應對。
到此這篇關於JavaScript
嚴格模式use strict
的介紹的文章就介紹到這瞭,更多相關JavaScript嚴格模式use strict內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!