'use strict'
在支持ECMAScript5严格模式解释器的浏览器下,在脚本开始处加上'use strict'指令来表示下面的代码将用严格模式的解释器来解释。
'use strict'; // something to do
与普通模式区别的是
- 禁止使用具有作用域链的with语句
- 所有的变量须在声明后使用
function test1() { a = 1; // 创建了一个全局变量 console.log(1); // 1 } function test2(){ 'use strict'; b = 1; // 引用错误异常 ReferenceError console.log(b); }
- 函数体内的this===undefined
function test3(){ console.log(this); // this为全局对象 } function test4(){ 'use strict'; console.log(this); // undefined }
- call和apply方法里的this总是第一个传入的参数,不会进行转换
function test5(){ console.log(this); } function test6(){ 'use strict'; console.log(this); } test5.call(); // 输出全局变量 test6.call(); // 输出undefined
- 操作不可编辑的属性会报错
function test7(){ 'use strict'; delete Object.prototype; } test7(); // 抛出TypeError异常
- 同作用域下同名属性和同名方法会报错(非严格模式下不报错)
- 不允许八进制直接量(非严格模式中某些浏览器实现可以)
- 在严格模式中eval和arguments作为关键字,不能赋值,也不能用来做变量、函数名、用作函数参数或用作catch模块的标识符
- delete后出现非法标识符会报错
- 限制了对调用栈的检测能力,如arguments.callee和arguments.caller。这两个属性调用时在严格模式下都会抛出类型错误。