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

在非嚴格模式下使用Fucntionapply()或者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!

推薦閱讀: