首先,概述

除了正常的运行模式,ECMAscript 5加二操作模式:严格模式。顾名思义,这个模型允许Javascript运行更严格的条件下。

建立严格模型的主要目的如下:

消除一些不合理和unrigorous Javascript语法,减少一些奇怪的行为;
消除代码运行的不安全性,保证代码运行的安全性。
提高编译效率,提高运算速度。
为未来的Javascript新版本铺平道路。


严格的模式反映了Javascript更合理、更安全、更严谨的发展方向。包括IE 10在内的主流浏览器已经支持它,许多大型项目已经开始接受它。

另一方面,相同的代码在严格的模式下可能会有不同的操作结果,一些正常模式下运行的语句不会在严格的模式下运行。掌握这些内容有助于更详细更深入地理解Javascript,使您成为更好的程序员。

本文将对严格模型进行详细描述。

两。入口标志

进入严格模式的符号如下行:

使用严格;

旧版本的浏览器会把它当作普通字符串的一行,而忽略它。

三。如何调用

在严格模式下有两种调用方法,可以在不同的情况下使用。

3.1用于整个脚本文件

使用严格设置在脚本文件的第一行,整个脚本将以严格的方式运行。如果该行不在第一行,则它无效,整个脚本以正常模式运行。如果将不同模式的代码文件合并到一个文件中,则需要特别注意这一点。



使用严格;
console.log(这是一个严格的模型。);



console.log(这是正常的模式。);





上面的代码表明在一个页面中有两段Javascript代码,前面的脚本标记是严格的模型,而后一个则不是。

3.2个单一函数

严格使用在函数体的第一行,整个函数在严格的模式下运行。


函数严格(){
使用严格;
返回这是一个严格的模型。;
}

功能不严(){
返回这是正常模式;
}




3.3脚本

因为第一种调用方法不利于文件合并,所以最好借用第二种方法将整个脚本文件放在一个匿名函数中,然后立即执行。


(函数(){())

使用严格;


这里的代码

})();




四,语法和行为的变化

严格的模式使Javascript的语法和行为发生了一些变化。

4.1全局变量显式声明

在正常模式下,如果一个变量在没有声明的情况下被赋值,默认是一个全局变量。严格的模式禁止这种用法,并且必须显式声明全局变量。


使用严格;

v=1;
错误,没有v语句

对于(i = 0;i < 2;i + +){
错误,不,我声明
}




因此,在严格的模式下,必须用var命令声明变量,然后再使用。

4.2静态绑定

Javascript语言的一个特点是允许动态绑定,也就是说,哪些属性和方法属于编译时未确定的对象,而是在运行时(运行时)确定的。

严格的模式不允许动态绑定,只有静态绑定是允许的,也就是说,属性和方法属于哪个对象,必须在编译阶段确定,这将有助于提高编译效率,并使代码更容易阅读,并且不那么意外。

具体而言,它涉及以下几个方面。

(1)禁止使用声明

因为编译时无法确定带语句,该属性属于哪个对象。


使用严格;

var=1;

带(o){
语法错误
v=2;
}




(2)创建一个评估范围

在正常模式下,Javascript语言有两变量域(范围):全球范围和功能域。严格的模型创建第三个范围:评价范围。

在正常模式下,的eval语句的范围取决于它在全球范围或职能范围。严格模式,eval语句本身是一个范围,可以不再产生全局变量和变量的产生只能在eval使用。


使用严格;
变量x=2;
Console.info(eval(var x = 5;X)));
5
Console.info(X);
2




4.3加强安保措施

(1)禁止此关键字指向全局对象。


函数f(){
返回!这;
}

返回false,因为指的是全局对象这个false!

函数f(){
使用严格;
返回!这;
}
返回true,因为严格的模式,这个值是未定义的,所以这是真的!。




因此,当使用构造函数时,如果忘记添加新的,则不再指向全局对象,而是错误的。


函数f(){

使用严格;

这个= 1;

};

(f);
错误,这是没有定义的



(2)禁止遍历函数中的调用堆栈


函数f1(){

使用严格;

f1.caller;
/ /报错

f1.arguments;
/ /报错

}

(F1);



4.4禁止删除变量

在严格模式下不能删除变量。只有将可配置设置为对象的属性才能删除。


使用严格;

var x;

删除;
语法错误

var o = object.create(null,'x',{
值:1,
配置:真
});

删除OX;
删除成功



4.5显式错误报告

在正常模式下,对象的只读属性被赋值,它不会被错误地报告,但它只能默默地失败。在严格的模式下,它将被报告错误。


使用严格;

var;

object.defineproperty(O,V

O=2;
/ /报错




在严格的模式下,使用吸气剂方法读取的属性将被分配给错误。


使用严格;

var { { { {

获取v(){返回1;}

};

O=2;
/ /报错




在严格模式下,向未扩展的对象添加新属性将被报告错误。


使用严格;
var;
object.preventextensions(O);
O=1;
/ /报错




在严格模式下,删除非删除属性将为false。


使用严格;
删除Object.prototype;
/ /报错




4.6同样的错误

在严格的模式中加了几个语法错误。

(1)属性对象不能具有相同的

在正常模式下,如果对象具有多个属性名,则最后一个赋值的属性覆盖前面的值。严格模式下,这是一个语法错误。




使用严格;
var { { { {
p:1,
P:2
};

语法错误




(2)参数函数的名称不一样。

在正常模式下,如果参数函数有多个名称,可以使用参数{ }来读取。在严格模式下,这是一个语法错误。


使用严格;

函数f(a,a,b){
语法错误

返回;

}




4.7禁止八进制表示

在正常模式下,如果整数的第一个数字是0,则表示这是八进制数,如0100等于十进制64。严格的模型禁止这种表示,第一个整数是0,这将被错误地报告。




使用严格;
var = 0100;
语法错误




4.8个参数对象限制

参数是函数的参数对象,严格的模式限制了它的使用。

(1)不允许参数赋值。


使用严格;
参数+;
语法错误
var obj = {集P(参数){ } };
语法错误
尝试{ catch catch(参数){ }
语法错误

函数的参数(){ }
语法错误

新函数()
语法错误




(2)参数不再跟踪参数的变化


函数f(a){
a = 2;
返回{,参数{ 0 } };
}

f(1);
/ /正常模式} { 2

函数f(a){

使用严格;
a = 2;
返回{,参数{ 0 } };

}

f(1);
/ /严格{ 2,1模式}




(3)禁止使用arguments.callee

这意味着不能在匿名函数内调用自己。


使用严格;

f(){ var函数返回参数。被叫;};

(f);
/ /报错




4.9个函数必须在顶层声明。

将来将在块级范围内引入一个新版本的Javascript,为了与新版本一致,严格模式只允许在全局范围或函数域中声明函数的顶层声明,换句话说,不允许在非功能代码块中声明函数。


使用严格;

如果(真){

函数f(){ }
语法错误

}

对于(var i = 0;i < 5;i + +){

函数F2(){ }
语法错误




4.10保留字

为了在将来过渡到新版本的Javascript,严格模式增加了一些保留字:实现、接口、让、包、私有、受保护、公开、静态、屈服。

将这些词用作变量名将为false。


函数包(受保护){
语法错误

使用严格;

VaR工具;
语法错误

}




此外,ECMAscript第五版本身还指定了其他一些保留字:类、枚举、出口、进口、延伸、超。他们不能用,太。

以上是本文的全部内容,希望能对大家有所帮助。