严格模式是在ECMAScript5以后引入的,它的作用是检测代码中潜在的错误,使代码更加偏进规范化
严格模式使用"use strict"来声明,可以定义在全局作用域中,可以定义在某个函数内部。需要注意的是如果是在全局作用域中定义,若是将该JS脚本应用到另外一个文件,那么引用页的代码也需要符合严格模式编码规范。
没有页面控制权时,最好是在需要测试的特定函数中开启严格模式。
严格模式下变量要注意什么?
1.变量声明要带var 关键字
2.不可以用delete操作符,严格模式下回导致错误,非严格模式静默失败
3.变量名不可以使用一些保留字如interface、let、package、private等
严格模式下的对象
1.只读对象不可赋值,回报typeerror错误
2.不可配置对象不可用delete,否则回报typeerror
3.不可扩展对象不可以添加属性
4.使用对象字面量时,对象里的属性名要唯一
严格模式下的函数
1.命名函数的参数要是唯一,如function test(num,num){}参数同名在严格模式下会报错,非严格模式没有错误但是只会访问第二个参数
2.严格模式下修改命名函数的参数值,在函数内部修改参数的值,严格模式下这个修改不会改变argument[0]的值,非严格模式下这个修改会改变arguments[0]的值,所以下述函数在两种模式下访问arguments[0]的结果是不一样的。
如下:
function changeValue(value) {
value = 'changed';
alert(value); //changed
alert(arguments[0]); //非严格模式下,弹出结果changed
//严格模式,弹出结果hello
}
changeValue('hello');
3.严格模式下淘汰了arguments.callee引用函数本身、arguments.caller引用调用函数,若访问会弹出typeerror错误
4.函数名不可以用保留字‘
5.只可以在脚本的顶级和函数内部声明函数,如在if语句中声明函数会报错
严格模式下的eval()函数
eval所包含的变量或函数不再创建上下文,即如若访问eval语句中创建的变量会抛出typeerror。
function test() {
"use strict"
eval("var x=10");
alert(x);//严格模式抛出typeerror;非严格模式显示10
}
test();