"use strict"详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了"use strict"详解相关的知识,希望对你有一定的参考价值。
参考:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html
目的:
- 消除javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 提高编译器效率,增加运行速度;
- 为未来新版本的JavaScript做好铺垫。
行为:
全局变量必须显示声明
"use strict" v = 1 // 报错,v未声明 for(i = 0;i<2;i++){ //报错,i未声明 }
禁止使用with语句
因为with语句无法在编译时就确定,属性到底归属哪个对象。
"use strict"; var v = 1; with (o){ // 语法错误 v = 2; }
创设eval作用域
"use strict"; var x = 2; console.info(eval("var x = 5; x")); // 5 console.info(x); // 2
禁止this关键字指向全局对象
function f(){ return !this; } // 返回false,因为"this"指向全局对象,"!this"就是false function f(){ "use strict"; return !this; } // 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。
function f(){ "use strict"; this.a = 1; }; f();// 报错,this未定义
禁止在函数内部遍历调用栈
function f1(){ "use strict"; f1.caller; // 报错 f1.arguments; // 报错 } f1();
禁止删除变量
严格模式下无法删除变量。只有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 = { p: 1, p: 2 }; // 语法错误 function f(a, a, b) { // 语法错误 return ; }
禁止八进制表示法
"use strict"; var n = 0100; // 语法错误
不允许对arguments赋值 arguments不再追踪参数的变化 禁止使用arguments.callee(已被ES5抛弃)
function f(a){ "use strict" 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]
保留字
function package(protected) { // 语法错误 "use strict"; var implements; // 语法错误 }
以上是关于"use strict"详解的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript语法支持严格模式 -- "use strict"
带有“非简单参数”的函数为什么不能包含 "use strict" 指令
JavaScript中严格模式"use strict";需注意的几个雷区:
“use strict”如何修改Javascript中“this”的规则?
如果使用它,“use strict”会使我的 CasperJS 测试崩溃
为啥“transform-es2015-modules-commonjs”在 Babel 6 中添加了“use strict”?