首页 > 试题

strict的用法

更新时间:2022-11-14 17:19:57 阅读: 评论:0

上海中考网官网-紧的同音字


2022年11月14日发(作者:精神文明创建活动方案)

严格模式ustrict详解

⼀、概述

除了正常运⾏模式,ECMAscript5添加了第⼆种运⾏模式:(strictmode)。顾名思义,这种模式使得Javascript在更严格的条件下运⾏。

设⽴"严格模式"的⽬的,主要有以下⼏个:

-消除Javascript语法的⼀些不合理、不严谨之处,减少⼀些怪异⾏为;

-消除代码运⾏的⼀些不安全之处,保证代码运⾏的安全;

-提⾼编译器效率,增加运⾏速度;

-为未来新版本的Javascript做好铺垫。

"严格模式"体现了Javascript更合理、更安全、更严谨的发展⽅向,包括IE10在内的主流浏览器,都已经它,许多⼤项⽬已经开始全⾯拥抱

它。

另⼀⽅⾯,同样的代码,在"严格模式"中,可能会有不⼀样的运⾏结果;⼀些在"正常模式"下可以运⾏的语句,在"严格模式"下将不能运⾏。

掌握这些内容,有助于更细致深⼊地理解Javascript,让你变成⼀个更好的程序员。

本⽂将对"严格模式"做详细介绍。

⼆、进⼊标志

进⼊"严格模式"的标志,是下⾯这⾏语句:

"ustrict";

⽼版本的浏览器会把它当作⼀⾏普通字符串,加以忽略。

三、如何调⽤

"严格模式"有两种调⽤⽅法,适⽤于不同的场合。

3.1针对整个脚本⽂件

将"ustrict"放在脚本⽂件的第⼀⾏,则整个脚本都将以"严格模式"运⾏。如果这⾏语句不在第⼀⾏,则⽆效,整个脚本以"正常模式"运⾏。

如果不同模式的代码⽂件合并成⼀个⽂件,这⼀点需要特别注意。

(严格地说,只要前⾯不是产⽣实际运⾏结果的语句,"ustrict"可以不在第⼀⾏,⽐如直接跟在⼀个空的分号后⾯。)

上⾯的代码表⽰,⼀个⽹页中依次有两段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小时内删除。

上一篇:引人注目造句
下一篇:help的过去式
标签:strict的用法
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图