闲话不说,直接进入正题。
相较于我们常用的非严格模式,JS的严格模式是未来EMCAScript版本的基础,理解严格模式,对我们掌握未来的ES版本有很大的帮助效果。
1、变量上的不同
(1)
message = "Hello Word"
如上,当我们在非严格模式中这样定义一个message时,因为在前面没有使用var关键字,则message相当于是我们声明的一个全局变量。
但是,在严格模式中,如果我们这样声明变量,则只会抛出ReferenceError;
(2)
var color = "red";
delete color;
如上,当我们在非严格模式中对一个变量调用delete操作符时,非严格模式会允许这样的操作,但是会静默失败。
但是,在严格模式中,会抛出ReferenceError;
(3)对于变量名有所限制:let、implements、interface、package、private、protected、public、static、yield不能作为变量名。这些都是保留字,未来的ES版本中可能会用到。
2、对象上的不同
(1)对只读属性赋值会抛出TypeError;
(2)对不可配置对象调用delete操作符会抛出TypeError;
(3)对不可扩展对象添加属性会抛出TypeError;
(4)
var x = {
name = "jack",
name = "martin"
}
对非严格模式而言,对象的属性名重复不会导致错误,x.name的值为martin。
在严格模式下,会抛出语法错误。
3、函数上的不同
(1)
var x = function(num,num){
//do something
}
在非严格模式下,这个函数声明不会抛出错误,但是通过参数名num只能访问第二个参数,想访问第一个参数需要通过arguments对象。
在严格模式下,会抛出语法错误。
(2)在严格模式下,arguments对象的行为也有所不同。
function x(){
num = "b";
alert(num);
alert(arguments[0]);
}
x("a");
非严格模式下,alert(num)// b,alert(arguments[0])//b;(修改参数的值会反应到arguments中)
严格模式下,修改arguments【0】= “b”,alert(num)//b,alert(arguments[0])// a;(修改参数的值不会反应到arguments中,两者独立)
(3)淘汰了arguments.callee和arguments.caller
(4)对函数名做出了限制:let、package、protected、private、public、static、yield、implements、interface
(5)在if语句中不能声明函数,否则会报错
4、eval()的变化(eval方法——自动计算其中包含的字符串)
function x (){
eval("var a = 10");
alert(a);
}
如上函数,在非严格模式中,因为eval中声明了一个变量a,所以最后会弹出对话框显示10;
在严格模式中,eval中声明的所有变量,都只会在计算时存在一个特殊域中,计算完后自动删除,所以最后报错,未声明a;
5、eval和arguments
(1)不能使用eval和arguments作为变量名和函数名;
(2)不能给他们赋另外一个值;
(3)在try-catch语句中用作例外名
6、抑制this
var color = "red";
function x(){
alert(this.color);
}
x.call(null);
在非严格模式下,给x.call中传入了null,意味着指向全局变量,所以最后弹出red;
在严格模式下,这个函数的this指向的是null,最后访问this的属性时会报错
7、(1)抛弃了with语句
(2)去掉了JavaScript中的八进制字面量。