阮一峰的网络日志——Javascript严格模式详解
“严格模式”的目的
消除javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
消除代码运行的一些不安全之处,保证代码运行的安全;
提高编译器效率,增加运行速度;
为未来版本的JavaScript做好铺垫
“严格模式”标志
(function(){
"use strict";
//code here
})();
语法的改变
全局变量显示声明
"use strict"
v=1; //报错,v未声明
for(i=0;i<2;i++){
}//报错,i未声明
静态绑定
禁止使用with语句
"use strict"
var v=1;
with(o){
v=2;
}//语法错误
创设eval作用域
正常模式下,javascript语言有两种变量作用域(scope):全局作用域和函数作用域,严格模式创设了第三种作用域:eval作用域
严格模式下,eval作用域中生成的变量只能用于内部
“use strict”;
var x=2;
console.info(eval("var x=5;x")); //5
console.info(x);//2
增强的安全措施
禁止this关键字指向全局对象
function f(){
return !this;
}//false
function f(){
"use strict";
return !this;
}//true,严格模式下this的值为undefined,!this的值为true
function f(){
"use strict";
this.a = 1;
};
f();//报错,this未定义
只能使用new f(),将this的指向明确的对象
禁止在函数内部遍历调用栈
function f1(){
"use strict";
f1.caller; //报错
f1.arguments;//报错
}
禁止删除变量
严格模式下无法删除变量,只有configurable设置为true的对象属性,才能被删除
"use strict";
var x;
delete x; //语法错误
var o = Object.create(null, {
'x':{value:1,configurable:true}
});
delete o.x; //删除成功
显式报错
正常模式下,对一个对象的只读属性进行赋值,不会报错,严格模式会
"use strict";
var o = {};
Object.defineProperty(o, {value:1, writable:false});
o.v = 2; //报错
严格模式下,对一个使用getter方法读取的属性进行赋值,会报错
"use strict";
var o ={
get v(){return 1;}
};
o.v = 2; //报错
严格模式下,对禁止扩展的对象添加新属性,会报错
"use strict";
var o ={};
Object.preventExtensions(o);
o.v = 2; //报错
重名错误
对象不能有重名的属性
"use strict";
var o = {
p:1,
p:2
};//语法错误
函数不能有重名的参数
"use strict";
function f(a, a, b) { // 语法错误
return ;
}
禁止八进制对法
正常模式下,整数的第一位如果是0,表示这是八进制数,比如0100等于十进制的64。严格模式禁止这种表示法,整数第一位为0,将报错。
"use strict";
var n = 0100; // 语法错误
arguments对象的限制
不允许对arguments赋值
"use strict";
arguments++;//错误
var obj = { set p(arguments) { } }; // 语法错误
try { } catch (arguments) { } // 语法错误
function arguments() { } // 语法错误
var f = new Function("arguments", "'use strict'; return 17;"); // 语法错误
arguments不再跟踪参数的变化
function f(a) {
a = 2;
return [a, arguments[0]];
}
f(1); // 正常模式为[2,2]
function f(a) {
"use strict";
a = 2;
return [a, arguments[0]];
}
f(1); // 严格模式为[2,1]
禁止使用arguments.callee
无法在匿名函数内部调用自身
"use strict";
var f = function(){ return arguments.callee;};
f(); //报错
函数必须声明在顶层
"use strict";
if (true) {
function f() { } // 语法错误
}
for (var i = 0; i < 5; i++) {
function f2() { } // 语法错误
}
保留字
新增的一些保留字:implements
, interface
, let
, package
, private
, protected
, public
, static
, yield
。