js严格模式
可以在函数内部选择进行较为严格的全局和局部的错误条件检测,使用严格模式的好处是可以提早知道代码中存在的错误,及时补货一些可能导致编程错误的行为。
关键字(编译指示) 为一个不会赋给任何变量的字符串 “use strict”。这个关键字可以选择放在全局作用域上,来限制整个脚本。也可以只放在某个局部作用域中,限制局部脚本的。(例如:放在一个函数里面)
function doSomething(){
"use strict";
//其他代码
}
1书写变量的要求:
1.变量声明
"use strict";
a=10;
console.log(a);//10
上面的两行代码从两个角度看:
非严格模式: 不会提示错误,即使没有写声明变量的关键字var,也不会提示错误,且此时“a”为全局变量。
严格模式: 会抛出错误信息“Uncaught ReferenceError: a is not defined”。
严格模式下,变量不允许重名,且要先定义再使用。
2.变量删除
非严格模式: 允许使用delete删除变量。
严格模式: 不允许删除变量,会抛出ReferenceError。
3.变量名:
严格模式: 不能使用implements、interface、let、package、private、protected、public、yield作为变量名。(引自js高级程序设计)
2 对象
严格模式下的要求:
- 不能为只读属性赋值,会抛出TypeError错误。
- 不可配置的属性使用delete操作符会抛出TypeError错误。
- 不可扩展的对象添加属性会抛出TypeError错误。
- 在使用对象字面量时,属性名必须唯一。
//重名属性
//非严格:没有错误提示,以第二个为准
//严格:抛出语法错误
var Person = {
name:"早",
name:"晚"
}
3函数
1.函数参数重名:
//非严格模式下,没有错误,以第二个属性为准。
//严格模式下,抛出语法错误。
function sum(num,num){
var k=num+num;
console.log(k);//30,非严格模式
}
sum(14,15);
2.修改命名参数的值
function showValue(value){
value = "foo";
alert(value);//非严格为“foo”,严格“foo”
alert(arguments[0]);//非严格为“foo”,严格“Hi”
}
showValue("Hi");
非严格模式: 修改会反映到arguments中。
严格模式: 修改不会反映到arguments中。
3.函数名:
严格模式: 不能使用implements、interface、let、package、private、protected、public、yield作为变量名。(引自js高级程序设计)
4.严格模式下,只能在脚本的顶级和函数的内部声明函数。因此,当函数声明在判断语句中时会报错。
4.关于eval和arguments
W3School定义 eval():该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回。因此不要为 eval() 函数传递 String 对象来作为参数。
function doSomething(){
eval("var x=10");
alert(x);//非严格模式下会显示10,严格模式下会抛出错误。
}
doSomething();
eval和arguments两者均不能作为表示符。
5.其他
严格模式下不允许使用八进制。