Javascript专题(一)严格模式

严格模式是干什么的?它从哪里来?

ECMAScript5中引入了严格模式。它为JS定义了一种不同的解析和执行模型。
摘自阮一峰博客:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html

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

正所谓未雨绸缪,JS如今的发展确实是有根源的。从这里做好铺垫我们可以看到JS的野心。

如何开启严格模式?

  • 全局开启:"use strict";//可在开头加入,则在整个脚本(从某个script标签开始到其闭合,下一个script还是正常模式)开启严格模式

必须在开头加,在其他地方加无效。
(严格地说,只要前面不是产生实际运行结果的语句,"use strict"可以不在第一行,比如直接跟在一个空的分号后面。)

  • 局部开启:function doSomething(){"use strict";}

可在函数体内部的头部加入,局部开启严格模式

更严谨的代码,严格模式实例?

以下代码跑在 Node 6.10.0下。

  • 1.在严格模式下,初始化未经声明的变量会导致错误。

    haha = 8; // 没有报错
    
    "use strict";
    haha = 8; // 报错,直接不让往下运行了。
    
    "use strict";
    for (i = 0; i < 8; i++) {
      console.log(i);
    } // 报错
    
  • 2.在严格模式下,不能定义名为eval或者arguments的变量,否则会导致语法错误。
    按照规则,关键字作为语言保留,不能作标识符,严格模式下的保留字也有所不同。

    "use strict";
    const eval = 8; // 报错。
    
  • 3.静态绑定。JS的一个语言特点,就是允许"动态绑定".某些属性和方法到底属于哪一个对象,不是在编译的时候确定的,而是在运行的时候确定的。严格模式下,只允许静态绑定

    • 禁止使用 with - with无法在编译时确定属性归属于哪个对象。
    const o = {
      name: 'haha',
      age: 4
    }
    const nowName = o.name; // haha
    const nowAge = o.age; // 4
    // 上面这个的简写其实就是 with 的效果 - 实现对象的引用从而简化代码
    // ES3之后已经不需要它了,在它里面是不能用 const 的。。。忽略它吧它吧它吧
    with(o) {
      var myName = name; // haha
      var myAge = age; // 4
    }
    console.log(nowName, myName, nowAge, myAge);
    
    • 创设 eval 作用域

    正常模式下,JS有两种作用域,全局作用域和函数作用域。严格模式创设了第三种。
    想一想,这样的话是不是更安全了呢?防止全局字符串被解析为JS,防止注入.

    eval("var x = 3");
    console.log(x); // 3
    
    "use strict";
    eval("var x = 3");
    console.log(x); // 报错:x is not defined
    
  • 4.禁止this关键字指向全局对象

    function test () {
      return !!this;
    }
    console.log(test()); // true - 此时 this 指向全局 !!this 为 true
    
    "use strict";
    function test () {
      return !!this;
    }
    console.log(test()); // false - 此时 this 为 undefined,因为严格模式下不允许其指向全局
    
  • 5.八进制字面量在严格模式下是没有用的,报错(大多数,99%的博客都说没法用八进制,其实可以用0o12表示八进制,不能用的是012不能用罢了)

    0oxx表示法可用,直接用0xx无法用

    const a = 012;
    console.log(a); // 10
    
    "use strict";
    const a = 012;
    console.log(a); // 报错
    
  • 6.禁止删除变量

    只有configurable设置为true的对象属性才能被删除。

    "use strict";
    const x = 3;
    delete x; // 报错
    
    "use strict";
    const o =Object.create(null, {
      'x': {
        value: 1,
        configurable: true
      }
    });
    delete o.x;  // configurable 为 true,可删除
    

complete

一遍一遍的咀嚼,总会烂的。
原文地址:https://www.cnblogs.com/can-i-do/p/6661648.html