第七节: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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @ 2022-02-23 20:42  Yaopengfei  阅读(154)  评论(1编辑  收藏  举报