严格模式ustrict详解
⼀、概述
除了正常运⾏模式,ECMAscript5添加了第⼆种运⾏模式:(strictmode)。顾名思义,这种模式使得Javascript在更严格的条件下运⾏。
设⽴"严格模式"的⽬的,主要有以下⼏个:
-消除Javascript语法的⼀些不合理、不严谨之处,减少⼀些怪异⾏为;
-消除代码运⾏的⼀些不安全之处,保证代码运⾏的安全;
-提⾼编译器效率,增加运⾏速度;
-为未来新版本的Javascript做好铺垫。
"严格模式"体现了Javascript更合理、更安全、更严谨的发展⽅向,包括IE10在内的主流浏览器,都已经它,许多⼤项⽬已经开始全⾯拥抱
它。
另⼀⽅⾯,同样的代码,在"严格模式"中,可能会有不⼀样的运⾏结果;⼀些在"正常模式"下可以运⾏的语句,在"严格模式"下将不能运⾏。
掌握这些内容,有助于更细致深⼊地理解Javascript,让你变成⼀个更好的程序员。
本⽂将对"严格模式"做详细介绍。
⼆、进⼊标志
进⼊"严格模式"的标志,是下⾯这⾏语句:
"ustrict";
⽼版本的浏览器会把它当作⼀⾏普通字符串,加以忽略。
三、如何调⽤
"严格模式"有两种调⽤⽅法,适⽤于不同的场合。
3.1针对整个脚本⽂件
将"ustrict"放在脚本⽂件的第⼀⾏,则整个脚本都将以"严格模式"运⾏。如果这⾏语句不在第⼀⾏,则⽆效,整个脚本以"正常模式"运⾏。
如果不同模式的代码⽂件合并成⼀个⽂件,这⼀点需要特别注意。
(严格地说,只要前⾯不是产⽣实际运⾏结果的语句,"ustrict"可以不在第⼀⾏,⽐如直接跟在⼀个空的分号后⾯。)
"ustrict";
("这是严格模式。");
("这是正常模式。");kly,it'mititnow-Irunitonmyschool'snetworkthat
hasabout50computers.
上⾯的代码表⽰,⼀个⽹页中依次有两段Javascript代码。前⼀个script标签是严格模式,后⼀个不是。
3.2针对单个函数
将"ustrict"放在函数体的第⼀⾏,则整个函数以"严格模式"运⾏。
functionstrict(){
"ustrict";
return"这是严格模式。";
}
functionnotStrict(){
return"这是正常模式。";
}
3.3脚本⽂件的变通写法
因为第⼀种调⽤⽅法不利于⽂件合并,所以更好的做法是,借⽤第⼆种⽅法,将整个脚本⽂件放在⼀个⽴即执⾏的匿名函数之中。
(function(){
"ustrict";
//somecodehere
})();
四、语法和⾏为改变
严格模式对Javascript的语法和⾏为,都做了⼀些改变。
4.1全局变量显式声明
在正常模式中,如果⼀个变量没有声明就赋值,默认是全局变量。严格模式禁⽌这种⽤法,全局变量必须显式声明。
"ustrict";
v=1;//报错,v未声明
for(i=0;i<2;i++){//报错,i未声明
}
因此,严格模式下,变量都必须先⽤var命令声明,然后再使⽤。
4.2静态绑定
Javascript语⾔的⼀个特点,就是允许"动态绑定",即某些属性和⽅法到底属于哪⼀个对象,不是在编译时确定的,⽽是在运⾏时
(runtime)确定的。
严格模式对动态绑定做了⼀些限制。某些情况下,只允许静态绑定。也就是说,属性和⽅法到底归属哪个对象,在编译阶段就确定。这样做
有利于编译效率的提⾼,也使得代码更容易阅读,更少出现意外。
具体来说,涉及以下⼏个⽅⾯。
(1)禁⽌使⽤with语句
因为with语句⽆法在编译时就确定,属性到底归属哪个对象。
"ustrict";
varv=1;
with(o){//语法错误
v=2;
}
(2)创设eval作⽤域
正常模式下,Javascript语⾔有两种变量作⽤域(scope):全局作⽤域和函数作⽤域。严格模式创设了第三种作⽤域:eval作⽤域。
正常模式下,eval语句的作⽤域,取决于它处于全局作⽤域,还是处于函数作⽤域。严格模式下,eval语句本⾝就是⼀个作⽤域,不再能够
⽣成全局变量了,它所⽣成的变量只能⽤于eval内部。
"ustrict";
varx=2;
(eval("varx=5;x"));//5
(x);//2
4.3增强的安全措施
(1)禁⽌this关键字指向全局对象
functionf(){
return!this;
}
//返回fal,因为"this"指向全局对象,"!this"就是fal
functionf(){
"ustrict";
return!this;
}
//返回true,因为严格模式下,this的值为undefined,所以"!this"为true。
因此,使⽤构造函数时,如果忘了加new,this不再指向全局对象,⽽是报错。
functionf(){
"ustrict";
this.a=1;
};
f();//报错,this未定义
(2)禁⽌在函数内部遍历调⽤栈
functionf1(){
"ustrict";
;//报错
nts;//报错
}
f1();
4.4禁⽌删除变量
严格模式下⽆法删除变量。只有configurable设置为true的对象属性,才能被删除。
"ustrict";
varx;
deletex;//语法错误
varo=(null,{'x':{
value:1,
configurable:true
}});
deleteo.x;//删除成功
4.5显式报错
正常模式下,对⼀个对象的只读属性进⾏赋值,不会报错,只会默默地失败。严格模式下,将报错。
"ustrict";
varo={};
Property(o,"v",{value:1,writable:fal});
o.v=2;//报错
严格模式下,对⼀个使⽤getter⽅法读取的属性进⾏赋值,会报错。
"ustrict";
varo={
getv(){return1;}
};
o.v=2;//报错
严格模式下,对禁⽌扩展的对象添加新属性,会报错。
"ustrict";
varo={};
tExtensions(o);
o.v=1;//报错
严格模式下,删除⼀个不可删除的属性,会报错。
"ustrict";
ype;//报错
4.6重名错误
严格模式新增了⼀些语法错误。
(1)对象不能有重名的属性
正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前⾯的值。严格模式下,这属于语法错误。
"ustrict";
varo={
p:1,
p:2
};//语法错误
(2)函数不能有重名的参数
正常模式下,如果函数有多个重名的参数,可以⽤arguments[i]读取。严格模式下,这属于语法错误。
"ustrict";
functionf(a,a,b){//语法错误
return;
}
4.7禁⽌⼋进制表⽰法
正常模式下,整数的第⼀位如果是0,表⽰这是⼋进制数,⽐如0100等于⼗进制的64。严格模式禁⽌这种表⽰法,整数第⼀位为0,将报
错。
"ustrict";
varn=0100;//语法错误
4.8arguments对象的限制
arguments是函数的参数对象,严格模式对它的使⽤做了限制。
(1)不允许对arguments赋值
"ustrict";
arguments++;//语法错误
varobj={tp(arguments){}};//语法错误
try{}catch(arguments){}//语法错误
functionarguments(){}//语法错误
varf=newFunction("arguments","'ustrict';return17;");//语法错误
(2)arguments不再追踪参数的变化
functionf(a){
a=2;
return[a,arguments[0]];
}
f(1);//正常模式为[2,2]
functionf(a){
"ustrict";
a=2;
return[a,arguments[0]];
}
f(1);//严格模式为[2,1]
(3)禁⽌使⽤
这意味着,你⽆法在匿名函数内部调⽤⾃⾝了。
"ustrict";
varf=function(){;};
f();//报错
4.9函数必须声明在顶层
将来Javascript的新版本会引⼊"块级作⽤域"。为了与新版本接轨,严格模式只允许在全局作⽤域或函数作⽤域的顶层声明函数。也就是说,
不允许在⾮函数的代码块内声明函数。
"ustrict";
if(true){
functionf(){}//语法错误
}
for(vari=0;i<5;i++){
functionf2(){}//语法错误
}
4.10保留字
为了向将来Javascript的新版本过渡,严格模式新增了⼀些保留字:implements,interface,let,package,private,protected,public,static,
yield。
使⽤这些词作为变量名将会报错。
functionpackage(protected){//语法错误
"ustrict";
varimplements;//语法错误
}
此外,ECMAscript第五版本⾝还规定了另⼀些保留字(class,enum,export,extends,import,super),以及各⼤浏览器⾃⾏增加的const保
留字,也是不能作为变量名的。
五、参考链接
-MDN,
-uschmayer,
-DouglasCrockford,
(完)
转⾃
本文发布于:2022-11-14 17:19:57,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/18857.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |