"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”?