JS - 严格模式使用详解(use strict)
自 ECMAscript 5 起,Javascript 除了有正常运行模式,还增加了第二种运行模式:"严格模式"(strict mode)。下面我们就来聊一聊严格模式。
一、基本介绍
1,什么是严格模式?
顾名思义,严格模式模式就是使得 Javascript 在更严格的条件下运行。比如:
- 如果在语法检测时发现语法问题,则整个代码块失效,并导致一个语法异常。
- 如果在运行期出现了违反严格模式的代码,则抛出执行异常。
2,使用严格模式的好处
- 消除 Javascript 语法的一些不合理、不严谨之处,减少一些怪异行为;
- 消除代码运行的一些不安全之处,保证代码运行的安全;
- 提高编译器效率,增加运行速度;
- 为未来新版本的 Javascript 做好铺垫。
3,浏览器支持情况
- Internet Explorer 10 + (IE6,7,8,9 均不支持严格模式)
- Firefox 4+
- Chrome 13+
- Safari 5.1+
- Opera 12+
二、如何开启严格模式
我们在如下位置加入 "use strict";(也可以用单引号)便可以开启相应代码块中的严格模式:
(1)在全局代码的开始处加入。
<script> "use strict"; console.log("这是严格模式。"); </script>
(2)在函数声明代码开始处加入。
function strict(){ "use strict"; return "这是严格模式。"; }
(3)在 eval 代码开始处加入
eval('"use strict";/*局部严格模式*/');
(4)在 new Function() 所传入的 body 参数块开始加入。
var doAdd = new Function("iNum", "'use strict';alert(iNum + 20)");
三、严格模式对语法和行为的限制
1,变量必须声明才能使用
(1)变量 a 缺少 var 语句做声明,因此报错。
"use strict"; a=1;
(2)变量 b 未声明,因此报错。
"use strict"; var a=b=1;
2,闭包内的 this 不指向 Global 对象
比如下面代码,严格模式 alert 弹出的就是 undefined:
"use strict"; (function(){ alert(this); //输出undefined })();
3,函数形参不能重复声明
"use strict"; function func(a,a){};
4,eval 拥有类似闭包的作用域
虽然同名,但 eval 内的变量不会影响到外部变量。
"use strict"; var a=1,b=1; eval("var a=2"); window.eval("var b=2"); console.log("a:" + a); //1 console.log("b:" + b); //2
5,增加一些保留字(不能作为变量名)
(1)ECMAscript 第五版本身已规定一些保留字:class, enum, export, extends, import, super
(2)各大浏览器还自行增加的 const 保留字。
(3)严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。
"use strict"; var implements = "hangge.com"
6,不允许对 arguments 其赋值
"use strict"; arguments++; // 语法错误 var obj = { set p(arguments) { } }; // 语法错误 try { } catch (arguments) { } // 语法错误 function arguments() { } // 语法错误 var f = new Function("arguments", "'use strict'; return 17;"); // 语法错误
7,arguments 不再追踪参数的变化
(1)正常模式
function f(a) { a = 2; return [a, arguments[0]]; } f(1);
(2)严格模式
"use strict"; function f(a) { a = 2; return [a, arguments[0]]; } f(1);
8,无法使用 arguments.callee
这意味着,我们无法在匿名函数内部调用自身了。
"use strict"; var f = function() { return arguments.callee; }; f(); // 报错
9,无法使用 caller
我们无法通过 caller 获取到调用当前函数的函数的引用。
"use strict"; function a(){ alert(a.caller); // 报错 } function b() { a(); } b();
10,无法使用 with 语句
"use strict"; with({});
11,一些原来在普通模式下的无效操作会变成错误
(1)比如无法删除 var 声明的变量。
"use strict"; var a = 1; delete a;
(2)给只读属性赋值也会报错。
"use strict"; var o = {get a(){}}; o.a = 1;