在ECMAscript5严格模式介绍(严格的模式)

严格的模式是ECMAscript 5的新功能,它允许你把整个程序,或是一个函数,在严格的操作环境下,严格防止某些操作,抛出更多的例外。

虽然ECMAscript 5向下兼容ECMAscript 3,严格的模式,所有的功能,在不使用ECMAscript 3被禁用(或抛错了)而不是兼容。

在实现严格的模型时,有以下好处:

1。捕获一些编程错误并抛出异常。

2。防止某些相对不安全的操作(例如访问全局变量)并抛出异常。

三.禁用一些令人困惑的特性。

大多数关于严格的模式可以对ES5规范{ pdf第二百二十三页找到的信息}。

(注:ECMAscript 5严格的模式不同于Firefox的严格的模型)

如何启用严格模式

在程序开始时添加此语句可以使整个脚本的模式更加严格:

复制代码代码如下所示:

严格使用;



严格模式也只能在函数中启用,而不影响外部:

复制代码代码如下所示:

功能imstrict(){

严格使用;

您的代码…

}



严格的模式启用语句只是一个普通字符串,使用严格,没有任何新语法,这意味着它对旧浏览器没有任何负面影响。

函数中严格模式的实际应用是在严格的模式函数中定义整个Javascript类库,以便不影响外部代码。

复制代码代码如下所示:

非严格的代码…

(函数(){())

使用严格;

您的库严格定义…

});

非严格的代码…



那么,在严格模式下脚本的变化是什么

变量和属性

未定义变量的赋值将失败,而不是把这个变量作为全局变量。

编写一个可以被写为false的属性,删除一个可以配置为false的属性,或者添加一个可扩展为false的属性,这将导致错误。

对变量、函数或函数参数执行删除操作会导致错误。

复制代码代码如下所示:

变量foo =测试;

函数测试(){ }

删除富;错误

删除测试

功能测试2(arg){

删除处理程序;错误

}



在对象容器中定义相同的属性会导致抛出一个异常:

复制代码代码如下所示:

错误

{真的



eval

任何使用eval函数名称(主要目的是指一个eval函数的变量或对象的属性)是被禁止的。

复制代码代码如下所示:

生成错误…

obj.eval =…

obj.foo = eval;

VaR方法调用…;

对于(VAR EVAL…){ }

功能(EVAL){ }

功能测试(EVAL){ }

功能(EVAL){ }

新功能(eval)



此外,新的变量的声明无效通过eval声明:

复制代码代码如下所示:

eval(var a = false;);

打印(种类); / /未定义



功能

重写参数对象可能会导致错误:

复制代码代码如下所示:

参数=…};不允许



相同的名称参数会导致错误:

复制代码代码如下所示:

(函数)



对arguments.caller和arguments.callee访问将被抛出的异常。因此,任何需要使用匿名函数必须先命名,例如:

复制代码代码如下所示:

setTimeout(后来的功能(){)

做某事…

setTimeout(后1000);

},1000);



争论,来电,以及函数调用者属性不再存在,并定义它们的操作也被禁止。

复制代码代码如下所示:

函数测试(){ }

test.caller = 'caller '; / /错误



最后,一个长期的(非常讨厌)的bug已经解决:当使用无效或未定义为function.prototype.call或function.prototype.apply方法的第一个参数,这里面的功能将指向全局对象,严格的模式将无法执行,并抛出异常:

复制代码代码如下所示:

(函数({)})。调用(NULL)



用(){ }

带(){语句在严格模式下完全丢失。