這是我參與8月更文挑戰的第12天,活動詳情查看:8月更文挑戰前端
除了使用一些第三方插件以外,還有什麼辦法能夠提早發現一些比較直觀的錯誤? 答案就是使用 JavaScript 的嚴格模式。web
在 ES5 的時候,JS 首次引入了嚴格模式的概念,它會以更嚴格的條件去檢查你的代碼錯誤,它能夠全局使用,也能夠局部使用(應用到函數內部)。理解嚴格模式的規則是很是有必要的,在將來,ECMAScript 會逐步強制全局使用嚴格模式。markdown
很是簡單,提供一個不賦值給任何變量的字符串便可。這個字符串爲:函數
"use strict"
複製代碼
你能夠在 JS 文件中任何地方聲明這個字符串,若是不是聲明在函數內部,則表示該模式引用到全局。在函數內部開啓嚴格模式的例子以下:post
function demo(){
"use strict"
// do something...
}
複製代碼
嚴格模式下要求命名函數的參數必須是惟一的,不然拋出語法錯誤。而非嚴格模式下,則最後聲明的參數才能生效。網站
function foo(p1, p1){
//...
}
// SyntaxError
複製代碼
在嚴格模式下,若是修改參數值,不會影響 arguments 的變化,而在非嚴格模式下,參數值發生變化,arguments 也會一樣修改。ui
function foo(p1){
p1 = "Sam";
console.log(p1) // "Sam"
console.log(arguments[0])
// 嚴格模式下 "Echo"。非嚴格模式下 "Sam"
}
foo("Echo");
複製代碼
在非嚴格模式下,arguments.callee 和 arguments.caller 分別表明引用函數自己和調用函數。在嚴格模式中,這兩個都被去掉了,訪問任何一個都會拋出 TyepError 異常。 另外,在非嚴格模式下,在 if 語句內聲明函數會被自動提高到 if 語句外部,而在嚴格模式下,將會直接拋出語法錯誤。url
在 ES6 以後,參數容許有了一些便捷的操做,例如剩餘操做符、解構操做符和默認參數。但在 ES7 新加了一條,用了以上特殊操做的函數內部,不容許聲明嚴格模式。示例:spa
// 能夠
function foo(a, b, c) {
"use strict";
}
// 不能夠
function bar(a, b, c='d') {
"use strict";
}
// 不能夠
function baz({a, b, c}) {
"use strict";
}
// 不能夠
function qux(a, b, ...c) {
"use strict";
}
複製代碼
ES6增長的這些新特性期待參數與函數體在相同模式下進行解析。若是容許編譯指示"use strict"出如今函數體內,JavaScript解析器就須要在解析函數參數以前先檢查函數體內是否存在這個編譯指示,而這會帶來不少問題。爲此,ES7規範增長了這個約定,目的是讓解析器在解析函數以前就確切知道該使用什麼模式。插件