你不知道的JavaScript--第二章: 词法作用域

37 阅读1分钟

词法作用域: 定义在词法阶段(声明 赋值等)的作用域。

函数的词法作用域:无论函数在哪里被调用,也无论他如何被调用,他的词法作用域只由函数说在的词法作用域所决定。

词法作用域只会查找一级的标识符如 a b c, foo.bar.a只会查找foo所在的作用域,然后再找到以后通过对象的访问规则访问foo.bar的a属性

欺骗词法作用域 eval、with eval:编译器会把eval当作里面的字符串当作正常的代码执行,里面声明变量等操作可以修改当前的词法作用域,就相当于是一块内嵌的代码块。eval('var a = 1') 会在eval所在的词法作用域声明变量并赋值。

with 可以将一个没有或有多个属性的对象处理为一个完全隔离的词法作用域,因此这个对 象的属性也会被处理为定义在这个作用域中的词法标识符。

通俗一点就是传入一个对象,把该对象当作当前的词法作用域

尽管 with 块可以将一个对象处理为词法作用域,但是这个块内部正常的 var 声明并不会被限制在这个块的作用域中,而是被添加到 with 所处的函数作 用域中。

let obj = {a: 0}
with(obj) {
    a = 1
    b = 2
}

console.log(obj) // obj: {a:1}
console.log(b) // 2