阮一峰的网络日志——Javascript严格模式详解

“严格模式”的目的

  • 消除javascript语法的一些不合理、不严谨之处,减少一些怪异行为;

  • 消除代码运行的一些不安全之处,保证代码运行的安全;

  • 提高编译器效率,增加运行速度;

  • 为未来版本的JavaScript做好铺垫

“严格模式”标志

<script>
    "use strict";
    //code here
</script>

(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


bottle_
259 声望22 粉丝

好好学习,好好生活,好好工作