阮一峰的网络日志——Javascript严格模式详解javascript
消除javascript语法的一些不合理、不严谨之处,减小一些怪异行为;html
消除代码运行的一些不安全之处,保证代码运行的安全;java
提升编译器效率,增长运行速度;安全
为将来版本的JavaScript作好铺垫网络
<script> "use strict"; //code here </script> (function(){ "use strict"; //code here })();
"use strict" v=1; //报错,v未声明 for(i=0;i<2;i++){ }//报错,i未声明
"use strict" var v=1; with(o){ v=2; }//语法错误
正常模式下,javascript语言有两种变量做用域(scope):全局做用域和函数做用域,严格模式创设了第三种做用域:eval做用域
严格模式下,eval做用域中生成的变量只能用于内部函数
“use strict”; var x=2; console.info(eval("var x=5;x")); //5 console.info(x);//2
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的对象属性,才能被删除this
"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方法读取的属性进行赋值,会报错code
"use strict"; var o ={ get v(){return 1;} }; o.v = 2; //报错
严格模式下,对禁止扩展的对象添加新属性,会报错htm
"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; // 语法错误
"use strict"; arguments++;//错误 var obj = { set p(arguments) { } }; // 语法错误 try { } catch (arguments) { } // 语法错误 function arguments() { } // 语法错误 var f = new Function("arguments", "'use strict'; return 17;"); // 语法错误
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]
没法在匿名函数内部调用自身
"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
。