这是我参与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规范增长了这个约定,目的是让解析器在解析函数以前就确切知道该使用什么模式。插件