严格的模式引入ecmascript5使开发人员能够通过Javascript运行环境处理最常见的和未被发现的一些发展过程中的错误有一个更好的Javascript语言。很长一段时间,因为只有Firefox支持严格的模型,我一直持怀疑态度的严格的模型。但直到现在,所有的主流浏览器支持他们的最新版本,严格模式包括IE10,opera12和Android4,iOS5。现在是开始使用严格模式的时候了。

严格模型的作用是什么

严格的模型对Javascript进行了大量的修改,我把它们分为两类(明显的和微妙的),次要改进的目标是修复当前Javascript中的一些细节。对于这些问题,我不会深入研究。如果你有兴趣,请阅读精彩的文档由德米特里索什尼科夫ecma-262-5详细2章严格的模式写的。我在这里要介绍的严格模式介绍的明显变化,应该在你使用严格模式,最大的变化将有助于你认识的概念。

在你开始学习的具体特点,记住,一个严格的模型的主要目的是允许你调试更快和更容易。主要的操作环境中发现,把错误的问题比无声故障或奇怪的行为(不严格的开放模式的Javascript运行环境经常这样做)。严格的模式将把更多的错误,但这是一件好事,因为这些错误会引起你的注意和修复了很多,已经很难找到之前的潜在问题。

用关键字删除



首先,在严格模式下删除带语句,并且包含带语句的代码将在严格模式下抛出异常。

复制代码代码如下所示:

在严格模式下,Javascript代码将抛出错误。

带有(位置){

警报(链接);

}



防止意外分配全局变量



其次,局部变量必须在他们指定的声明。在严格模式已启用,同名的全局变量将自动为未声明的局部变量创建的。这是一个在用javacript程序最可能的错误,有明确的例外,当试图在一个严格的模式做这个。

复制代码代码如下所示:

严格模式可能引发异常。

(函数(){())

someundeclaredvar =foo;

}();



函数中的这个值不再默认为全局值。



严格模式中的另一个重要变化是函数中未定义或null或未定义默认情况下不指向全局环境(全局),这会导致代码执行中的一些错误,取决于函数中默认的这种行为,如:

复制代码代码如下所示:

window.color =红色;

功能saycolor(){

警戒(这个颜色);

}

如果红色不在严格的模式提示符下,则在严格模式下将出现错误。

SayColor();

如果红色不在严格的模式提示符下,则在严格模式下将出现错误。

saycolor.call(空);



在赋值之前,它仍然是未定义的,这意味着当构造函数执行时,如果之前没有明确的新关键字,它将抛出一个异常。

复制代码代码如下所示:

功能人(名称){

this.name =名称;

}

在严格的模式下/错误

var(=尼古拉斯);



在上面的代码中,构造函数在没有新的之前运行,函数中的这个函数仍然是未定义的。因为不能设置未定义的属性,所以上面的代码会抛出错误。操作的结果会意外地设置窗口全局变量的name属性。

防止重复



在编写大量代码时,对象属性和函数参数很容易设置为重复名称。

复制代码代码如下所示:

重复/变量名,在严格模式下将是错误的。

函数doSomething(value1,value2,value1){

代码

}

重复的对象属性名称在严格模式下将出现错误:

var对象{ { {



福:巴兹

};



上述代码在严格的模式下被认为是语法错误,并允许在执行前提示它。

安全的eval()



虽然eval()声明未结束时删除,有些改进是在严格的模式。最大的变化是,所执行的变量和函数eval()声明相应的变量或函数不会在当前范围内直接创造的,如:

复制代码代码如下所示:

(函数(){())

eval(var x = 10;);

非严格模式,警报10

在严格的模式下,因为没有定义x并抛出异常,

警报(x);

}();



任何变量或函数在eval执行创建()保持在eval()。但是你可以明确地从热解得到的返回值()语句来评价得到的执行结果(),如:

复制代码代码如下所示:

(函数(){())

VaR结果= eval(var x = 10,y = 20;X + Y );

正确的操作 / /在严格或非严格模式表的休息(结果= 30)。

警报(结果);

}();





修改只读属性时引发异常。



ecmascript5还介绍了为只读对象的特定属性,或者能够使整个对象不可变的。但在非严格模式,尝试修改只读属性只能默默的失败。你可能会遇到这种情况当你与一些浏览器原生API进行交互。严格的模式将明确扔了这种情况下的例外,并提醒你,这是不允许修改该属性。

复制代码代码如下所示:

var;

object.defineproperty(人,名称{ {

可写的:false,

值:尼古拉斯

});

在非严格模式下,严格模式下的静默故障。将抛出一个异常。

person.name =约翰;



在上面的示例中,name属性被设置为只读,并且在非严格模式下对name属性的修改不会导致报告错误,但是修改不会成功。

注意:强烈建议你开一个严格的模式,当你使用任何脚本属性指定。

如何使用它



在现代浏览器中很容易打开一个严格的模式,只需在Javascript代码中有以下说明

使用严格;



虽然上面的代码只是一个不提供变量的字符串,但它实际上是指示Javascript引擎切换到严格模式的一种方式。不支持严格模式的浏览器将忽略上述代码,不会对后续执行产生任何影响。虽然您可以将此指令用于全局或函数,但它也提醒您不要在全局环境中启用严格的模型。

复制代码代码如下所示:

请不要使用。

使用严格;

函数doSomething(){

代码的这一部分将以严格的方式运行。

}

功能dosomethingelse(){

这部分代码也将在严格的模式下运行。

}





虽然上面的代码看起来并不是一个大问题,但是当您不负责维护页面中引入的所有代码时,使用严格的模式将使您面临由第三方代码所造成的问题,对于严格的模式还没有准备好。

因此,最好使用在函数中打开严格模式的指令,例如:

复制代码代码如下所示:

函数doSomething(){

使用严格;

代码将以严格的方式运行此函数。

}

功能dosomethingelse(){

此函数在严格模式下不能运行。

}





如果你想让严格的方式在一个以上的功能打开,使用立即调用函数表达式(生活):

复制代码代码如下所示:

(函数(){())

使用严格;

函数doSomething(){

此函数在严格模式下运行。

}

功能dosomethingelse(){

这个函数也在严格的模式下运行。

}

}();





结论



我强烈建议你开始Javascript严格模式,从现在开始,它可以帮助你发现未在代码中发现错误。不在全球环境中启用它,但是你可以用生活尽可能(立即执行函数表达式)工作严格的模式为多功能的。一开始,你会遇到错误提示你没见过。这是正常的。当启用了严格的模式时,请确保在支持的浏览器中进行测试,以发现新的潜在问题。不要仅在代码中添加一行严格使用的代码,以为其余的代码可以正常工作。最后,请在严格的模式下编写更好的代码。

注:

下面是浏览器对严格模式的支持的摘要。

在这个页面上测试当前浏览器的严格模式支持是可能的。

严格模型的优点:

使Javascript更强

1。这不再是封装的,在正常模式下,这始终是一个对象。

2。Fun.caller和fun.arguments不可删除的属性,也可以设置或检索。

三.arguments.caller也是一种属性,不能删除,也不能被设置或检索。

为未来铺路ECMAscript版本

1。添加了下列保留字:实现、接口、让、包、私有、受保护、公共、静态和输出。

2。方法声明应放置在脚本或方法的顶部,不能放置在语句的中间,如if或。