详细介绍了严格的Javascript模式,严格的模式

严格模式(严格模式)是一种新的语法定义ECMA-262 5版,这是由严格的Javascript的语法表达。一些常见的写作方法将抛出SyntaxError异常,如:
在1之前没有使用var声明。变量
2。使用八进制语法:var = 023和var 047
三.使用带语句
4。使用删除删除一个变量名(而不是一个属性名称):删除myVariable
5。使用eval或参数作为变量名或函数名
6、用未来的保留字(可在ECMAscript 6):实现接口,让包,私人,保护,公共,静,和产量作为变量名或函数名。
在7。使用函数声明的语句块:如果(a)函数(f){ }
8。其他的错误
8.1。对象下面使用两个相同的属性名:{ A:1,B:3,A:7 }
使用相同的两个参数8.2。函数参数:函数f(a,b,b){ }

下面解释这些。

1。为什么要使用严格的模型(严格的模式)

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

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

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

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

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

两。声明严格的模型(严格模式)

声明一个严格的模式只是一个简单的语句:
复制代码代码如下:使用严格;
注意:旧版本的浏览器会把它当作普通字符串的一行,而忽略它。

三,宣布严格模式(严格模式)的地位和内容。

严格模式(严格模式)主要影响他的范围。如果使用功能,不会使全球范围和其他未使用的功能变得严格模式(严格的模式)。也就是说,一个严格的方式申报的范围取决于它的上下文。如果严格模式在全球范围内宣布(超出范围的函数),程序中所有的代码是在一个严格的模式。如果严格模式是在函数声明,函数中的所有代码都在一个严格的模式。例如,在下面的例子中,所有的代码都在严格的模式,和变量声明在函数之外引起语法错误:没有变量的严格的模式定义,有要求在严格模式两种方法,可用于不同的场合。

1。对于整个脚本文件

使用严格设置在脚本文件的第一行,整个脚本将以严格的方式运行。如果该行不在第一行,则它无效,整个脚本以正常模式运行。如果将不同模式的代码文件合并到一个文件中,则需要特别注意这一点。
(严格地说,只要前面不是生成实际运行结果的语句,就不能使用严格的第一行,如直接跟随空分号)。

复制代码代码如下所示:

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



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



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

2。对于单个函数

严格使用在函数体的第一行,整个函数在严格的模式下运行。
复制代码代码如下所示:
函数严格(){
使用严格;
返回这是一个严格的模型。;
}
Function notStrict () {
返回这是正常模式;
}

三.脚本

因为第一种调用方法不利于文件合并,所以最好借用第二种方法将整个脚本文件放在一个匿名函数中,然后立即执行。
复制代码代码如下所示:
(函数(){())

使用严格;
这里的代码

});

四,严格模式下的语法和行为的变化

严格的模式(严格的模式)对Javascript的语法和行为做了一些修改。

1。全局变量显式声明

在正常模式下,当我们使用变量时,我们不必首先声明VaR,但是在严格的模式下,我们必须在使用变量之前声明var,否则会出现错误。
复制代码代码如下所示:
使用严格;
v = 1;错误,不v语句
对于(i = 0;i < 2;i +);错误,不i语句
}
因此,在严格的模式下,必须用var命令声明变量,然后再使用。

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

三.增强安全性的措施

(1)禁止此关键字指向全局对象。
复制代码代码如下所示:
函数f(){
返回!这;
}
返回false,因为指的是全局对象这个false!
函数f(){
使用严格;
返回!这;
}
返回true,因为严格的模式,这个值是未定义的,所以这是真的!。
因此,当使用构造函数时,如果忘记添加新的,则不再指向全局对象,而是错误的。
复制代码代码如下所示:
函数f(){

使用严格;
这个= 1;
};
(f);错误,这是没有定义的。
一般来说,函数调用f(),这个值将指向全局对象。在严格模式下,此值将指向未定义。通过电话和应用函数调用时,如果这个参数是原始值,除了一个空的和不确定的(字符串,数字,布尔值),这个值将被包装对象的原始值,如果对这个参数的值是未定义的值,这个值将指向全局对象。在严格的模式,这个价值是对这个参数的值,如果没有任何类型的转换。

(2)禁止遍历函数中的调用堆栈
复制代码代码如下所示:
函数f1(){

使用严格;
f1.caller; / /错误
f1.arguments; / /错误
}
(F1);


4。禁止删除变量

在严格模式下不能删除变量。只有将可配置设置为对象的属性才能删除。
复制代码代码如下所示:
使用严格;
var x;
删除x;语法错误
var o = object.create(null,'x',{
值:1,
配置:真
});
删除OX; / /删除成功

5。明确的错误报告

在正常模式下,对象的只读属性被赋值,它不会被错误地报告,但它只能默默地失败。在严格的模式下,它将被报告错误。
复制代码代码如下所示:
使用严格;
var;
object.defineproperty(O,V
O = v 2; /错误
在严格的模式下,使用吸气剂方法读取的属性将被分配给错误。
复制代码代码如下所示:
使用严格;
var { { { {
获取v(){返回1;}
};
O = v 2; /错误
在严格模式下,向未扩展的对象添加新属性将被报告错误。
复制代码代码如下所示:
使用严格;
var;
object.preventextensions(O);
O = v 1; /错误
在严格模式下,删除非删除属性将为false。
复制代码代码如下所示:
使用严格;
删除object.prototype; / /错误

6。同样的错误

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

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

在正常模式下,如果对象具有多个属性名,则最后一个赋值的属性覆盖前面的值。严格模式下,这是一个语法错误。
复制代码代码如下所示:
使用严格;
var { { { {
p:1,
P:2
}语法错误

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

在正常模式下,如果参数函数有多个名称,可以使用参数{ }来读取。在严格模式下,这是一个语法错误。
复制代码代码如下所示:
使用严格;
函数f(a,a,b)语法错误
返回;
}

7。禁止八进制表示

在正常模式下,如果整数的第一个数字是0,则表示这是八进制数,如0100等于十进制64。严格的模型禁止这种表示,第一个整数是0,这将被错误地报告。
复制代码代码如下所示:
使用严格;
var = 0100;语法错误
在8.arguments对象限制

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

(1)不允许参数赋值。
复制代码代码如下所示:
使用严格;
参数+ +;语法错误
var obj集P(参数)= { { } }; / /语法错误
尝试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);

9。函数必须在顶层声明。

将来将在块级范围内引入一个新版本的Javascript,为了与新版本一致,严格模式只允许在全局范围或函数域中声明函数的顶层声明,换句话说,不允许在非功能代码块中声明函数。
复制代码代码如下所示:
使用严格;
如果(真){
函数(f){语法错误
}
对于(var i = 0;i < 5;i + +){
函数(F2){语法错误
}

10。保留字

为了在将来过渡到新版本的Javascript,严格模式增加了一些保留字:实现、接口、让、包、私有、受保护、公开、静态、屈服。
将这些词用作变量名将为false。
复制代码代码如下所示:
函数包(受保护)语法错误
使用严格;
var实现;语法错误
}
此外,ECMAscript第五版还规定了其他一些保留字(类、枚举、出口、进口、延伸、超),并通过大浏览器添加const保留字,不能作为变量名。