1. 程式人生 > 程式設計 >es6函式之嚴格模式用法例項分析

es6函式之嚴格模式用法例項分析

本文例項講述了es6函式之嚴格模式用法。分享給大家供大家參考,具體如下:

從es5開始,函式內部可以設定為嚴格模式。

function doSomething(a,b) {
 'use strict'
 // code
}

es2016做了一點修改,規定只要函式引數使用了預設值,解構賦值,或者擴充套件運算子,那麼函式內部就不能顯示設定為嚴格模式,否則會報錯。

// 報錯
function doSomething(a,b = a) {
 'use strict'
 // code
}
const doSomething = function({a,b}) {
 'use strict'
 // code
}
const doSomething = (...a) => {
 'use strict'
 // code
}

const obj = {
 doSomething({a,b}) {
 'use strict'
 // code
 }
}

這樣規定的原因是,函式內部的嚴格模式,同時適用於函式體和函式引數。但是,函式執行的時候,先執行函式引數,然後再執行函式體,這樣就有一個不合理的地方,只有從函式體之中,才能知道引數是否應該以嚴格模式執行,但是引數卻應該先於函式體執行。

function doSomething(value = 070) {
 'use strict'
 return value
}

上面程式碼中,引數value的預設值是八進位制數070,但是嚴格模式下不能用字首0表示八進位制,所以應該報錯,但是實際上,javascript引擎會先成功執行value = 070,然後進入函式內部,發現需要用嚴格模式執行,這時才會報錯。

雖然可以先解析函式體程式碼,再執行引數程式碼,但是這樣無疑就增加了複雜性。因此,標準索性禁止了這種用法,只要引數使用了預設值,解構賦值,或者擴充套件運算子,就不能顯示指定嚴格模式。

兩種方法可以規避這種限制。第一種是設定全域性性的嚴格模式,這是合法的。

'use strict'
function doSomething(a,b = a) {
 // code
}

第二種是把函式包在一個無引數的立即執行函式裡面。

const doSomething = (function() {
 'use strict'
 return function (value = 42) {
 return value
 }
})

感興趣的朋友可以使用線上HTML/CSS/JavaScript程式碼執行工具:http://tools.jb51.net/code/HtmlJsRun測試上述程式碼執行效果。

更多關於JavaScript相關內容可檢視本站專題:《JavaScript常用函式技巧彙總》、《javascript面向物件入門教程》、《JavaScript錯誤與除錯技巧總結》、《JavaScript資料結構與演算法技巧總結》及《JavaScript數學運算用法總結》

希望本文所述對大家JavaScript程式設計有所幫助。