严格模式就是在代码片段的顶部加上一个字符串常量的语句"use
strict";(也可以用单引号),它可以是全局的,也可以是局部的(function和eval两种局部作用域)。但是它必须是代码的第一个语句(未必要是第一行)。在它之前如果有任何语句(包括空语句),严格模式的声明就会失效。
"use
strict";//全局严格模式function
func(){ "use strict";
//局部严格模式};eval(‘"use strict";/*局部严格模式*/‘);;"use
知道了严格模式的声明,那么它到底要怎么用呢?下面我们一个个功能说明。
strict";//失效的严格模式声明
1.
变量必须声明才能使用
"use
strict";a=1;
//缺少var语句做声明,因此报错"use
2.
strict";var a=b=1;
//错误 b未声明
函数声明语句(不包括表达式)不允许在普通代码块(不包括闭包)中使用
"use
3.
strict";(function(){
//闭包中是允许使用函数声明语句的
function func(){};})();{
var f=function(){};
//函数声明表达式允许
function func(){};
//函数声明语句在普通闭包中,错误};
闭包内的this不指向Global对象
"use
4.
strict";(function(){ alert(this);
//输出undefined})();
对象属性和函数形参不能重复声明
"use
strict";var o={a:1,a:1};//这个对象定义了两个a属性,因此报错"use
5.
strict";function func(a,a){};//这个函数的两个形参都是a,因此报错
eval拥有类似闭包的作用域
"use
6.
strict";var a=1,b=1;eval("var
a=2");window.eval("var b=2");alert(a);
//输出1 因为运行的a变成了eval作用域的局部变量alert(b);
//输出2 window.eval依然是全局作用域
callee和caller属性无法使用
"use
7.
strict";function func(){
return
arguments.callee;
//错误 callee无法使用};func();
with语句无法使用
"use
8.
strict";with({});
八进制数字常量无法使用
"use
9.
strict";var a=0999;
//十进制,可以使用var b=0123;
//八禁止,无法使用
普通模式下的一些无效操作变成错误
"use
strict";var a=1;delete a;//错误
无法删除var声明的变量"use
暂时就总结出这些啦,还有一些细节的条款我也描述的不是那么准确,建议看看MDN上的描述。参考:
strict";var o={get a(){}};o.a=1;//错误
给只读属性赋值