• 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

    一遍一遍的咀嚼,总会烂的。
  • 相关阅读:
    sql 常见错误
    jdbc 回顾
    oracle return code 2112
    cobol COMP-3最后1位
    oracle Lower Upper length substr
    UTF-8 与 BIG-5 转码
    用UltraEdit转换大小写
    oracle substr
    oracle中 char,varchar,varchar2的区别
    oracle 查看16进制
  • 原文地址:https://www.cnblogs.com/can-i-do/p/6661648.html
Copyright © 2020-2023  润新知