参考文档

一、前言

除了正常运行模式,ECMAscript 5添加了第二种运行模式:“严格模式”(strict mode)。顾名思义,这种模式使得Javascript在更严格的条件下运行

二、目的

  • 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
  • 消除代码运行的一些不安全之处,保证代码运行的安全;
  • 提高编译器效率,增加运行速度;
  • 为未来新版本的Javascript做好铺垫。


三、标志

进入”严格模式”的标志,是下面这行语句:

  1. "use strict";

use strict 意思是使用严格模式,使用严格模式,一些不规范的语法将不再支持

四、调用

4-1 针对整个脚本

将”use strict”放在脚本文件的第一行,则整个脚本都将以”严格模式”运行。

  1. <script>
  2. "use strict";
  3. console.log("这是严格模式。");
  4. </script>
  5. <script>
  6. console.log("这是正常模式。");kly, it's almost 2 years ago now. I can admit it now - I run it on my school's network that has about 50 computers.
  7. </script>

4-2 针对单个函数

将”use strict”放在函数体的第一行,则整个函数以”严格模式”运行。

  1. function strict(){
  2. "use strict";
  3. return "这是严格模式。";
  4. }
  5. function notStrict() {
  6. return "这是正常模式。";
  7. }

4-3 变通写法

因为第一种调用方法不利于文件合并,所以更好的做法是,借用第二种方法,将整个脚本文件放在一个立即执行的匿名函数之中。

  1. (function (){
  2. "use strict";
  3. // some code here
  4. })();

五、严格模式的特点

  • 使调试更加容易。那些被忽略或默默失败了的代码错误,会产生错误或抛出异常,因此尽早提醒你代码中的问题,你才能更快地指引到它们的源代码。(实时显示错误代码,方便调试)
  • 防止意外的全局变量(不支持隐式全局变量)。
  • 禁止this关键字指向全局对象。在严格模式下,普通函数中的this默认是undefined,不再指向window;
  • 对象不能有重名的属性,函数不能有重名的参数
  • 使eval() 更安全。在严格模式下,新增了eval作用域。

    1. "use strict";
    2. var webName = "蚂蚁部落";
    3. eval("var webName = 'softwhy.com'; console.log(webName)"); //softwhy.com
    4. console.info(webName); //蚂蚁部落
  • 严格模式下,函数的caller、arguments等信息都不可以获取

  • 严格模式下,不支持8进制表示法
  • 严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield
  • 严格模式下无法删除变量。只有configurable设置为true的对象属性,才能被删除。