你不知道的JavaScript上卷 - 读书笔记 - 第2章词法作用域-2.2 欺骗词法

Posted 笑虾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你不知道的JavaScript上卷 - 读书笔记 - 第2章词法作用域-2.2 欺骗词法相关的知识,希望对你有一定的参考价值。

你不知道的javascript上卷 - 读书笔记 - 第2章词法作用域-2.2 欺骗词法

作用域

  1. JavaScriptES6以前只有函数作用域
  2. ES6开始支持块作用域: 通常就是 {} 包裹的范围
  3. 作用域中查找变量or函数的规则是从当前向上(父集)逐级查找,找到最近的就拿来用。
  4. 如果找到顶级(全局作用域:比如浏览器的window对象)还没有,就默认创建一个。
  5. 词法作用域的规则决定,所有变量or函数在写代码时就已经确定了他所在的作用域。但是也有动态修改词法作用域的情况比如evalwith
  6. 这两东西都不推荐使用了。但是作为学习理解还是有点用的。

evalwith的缺点

  1. 最直接的就是,有他们的存在使代码变的不确定,所以JS引擎就放弃对这段代码的优化。这导致性能低下。
  2. eval另一个显著的问题就是如果执行的字符串来自外部,很可能存在注入的风险。
  3. with还可能导致意外的修改上级作用域变量。例如下面代码就意外导致创建了一个全局变量 b。这种非预期的行为,会导致我们被莫名的BUG折磨致死。(除非创建全局变量 b就是你想要的结果,但是你也应该选择一个可读性更高的方案来实现)
function test(obj){
  with(obj){
    a = 1;
    b = 2;
  }
}
var obj = {a:0};
test(obj);
console.log(obj); // {a: 1}
console.log(b); // 2

以上是关于你不知道的JavaScript上卷 - 读书笔记 - 第2章词法作用域-2.2 欺骗词法的主要内容,如果未能解决你的问题,请参考以下文章

你不知道的javascript--上卷--读书笔记1

你不知道的javascript--上卷--读书笔记2

你不知道的JavaScript上卷 - 读书笔记 - 第2章词法作用域-2.2 欺骗词法

你不知道的JavaScript上卷 - 读书笔记 - 第2章词法作用域-2.2 欺骗词法

JavaScript中的this—你不知道的JavaScript上卷读书笔记

你不知道的Javascript(上卷)读书笔记之二 ---- 词法作用域