• 第七节:with、eval、严格模式剖析


    一. with详解

        with语句 扩展一个语句的作用域链

        注:不建议使用with语句,因为它可能是混淆错误和兼容性问题的根源。

     代码分享:

    {
      let name = "ypf1";
      let age = 18;
      let obj = {
        name: "ypf2",
        age: 19,
      };
      //下面中的name和age会从obj中查找
      with (obj) {
        console.log(name, age); //ypf2,19
      }
    }

    二. eval详解

        用途:eval是一个特殊的函数,它可以将传入的字符串当做JavaScript代码来运行。

        特别注意:不建议在开发中使用eval

            eval代码的可读性非常的差(代码的可读性是高质量代码的重要原则);

            eval是一个字符串,那么有可能在执行的过程中被刻意篡改,那么可能会造成被攻击的风险;

            eval的执行必须经过JS解释器,不能被JS引擎优化;

     代码分享:

    {
      var jsString = 'var message = "Hello World"; console.log(message);';
    
      var message = "Hello World";
      console.log(message);
    
      eval(jsString);
    }

    三. 严格模式详解

    1. 什么是严格模式?

        在ES6中,JavaScript提出严格模式,

        严格模式很好理解,是一种具有限制性的JavaScript模式,从而使代码隐式的脱离了 ”懒散(sloppy)模式“;

        支持严格模式的浏览器在检测到代码中有严格模式时,会以更加严格的方式对代码进行检测和执行;

    2. 开启严格模式的两种方式:

       (1). 全局开启

       (2). 函数中开启

    代码分享:

    {
      // 1. 整个文件开启严格模式
      // "use strict"
    
      //   2. 函数中开启
      function foo() {
        "use strict";
        true.foo = "abc";
      }
      foo();
    }

    3. 严格模式的限制

     (1). 无法意外的创建全局变量

     (2). 严格模式会使引起静默失败(silently fail,注:不报错也没有任何效果)的赋值操作抛出异常

     (3). 严格模式下试图删除不可删除的属性

     (4).严格模式不允许函数参数有相同的名称

     (5). 不允许0的八进制语法

     (6). 在严格模式下,不允许使用with

     (7). 在严格模式下,eval不再为上层引用变量

     (8). 严格模式下,this绑定不会默认转成对象

    代码分享: 

    "use strict";
    {
      // 1. 禁止意外创建全局变量
      {
        message = "Hello World";
        console.log(message);
        function foo() {
          age = 20;
        }
      }
      // 2.不允许函数有相同的参数名称
      {
        function foo(x, y, x) {
          console.log(x, y, x);
        }
        foo(10, 20, 30);
      }
      // 3.静默错误
      {
        true.name = "abc";
        NaN = 123;
        var obj = {};
        Object.defineProperty(obj, "name", {
          configurable: false,
          writable: false,
          value: "why",
        });
        console.log(obj.name);
        // obj.name = "kobe"
      }
      // 4.不允许使用原先的八进制格式 0123
      var num = 0o123; // 八进制
      var num2 = 0x123; // 十六进制
      var num3 = 0b100; // 二进制
      console.log(num, num2, num3);
      // 5.with语句不允许使用
      // 6.eval函数不会向上引用变量了
      {
        var jsString =
          '"use strict"; var message = "Hello World"; console.log(message);';
        eval(jsString);
        console.log(message);
      }
      //7. 严格模式,默认绑定中的this指向undefined,隐式绑定依旧执行obj
      {
        function foo() {
          console.log(this);
        }
        var obj = {
          name: "why",
          foo: foo,
        };
        foo(); //undefined
        obj.foo(); // 隐式绑定指向依旧obj
      }
    }
    View Code

    !

    • 作       者 : Yaopengfei(姚鹏飞)
    • 博客地址 : http://www.cnblogs.com/yaopengfei/
    • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
    • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    使用超酷的jQuery缩略图生成插件NailThumb制作漂亮的缩略图web应用
    极客Web前端开发资源大荟萃#015
    极客编程小挑战#29:实现手机上常见的某一功能的效果显示
    在线制作gif loading图
    极客标签二重大礼华丽登场 宅男宅女必备套装
    SVG矢量图形课程基础入门篇
    浏览器JS交互,点击查询
    11选5专家投注研究算法
    大龙VBox API参数插件
    利用DLL劫持内存补丁技术注入
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/15929143.html
Copyright © 2020-2023  润新知