什么是作用域:
就是变量或者是函数能作用的范围。
为什么作用域很重要:
使变量不被污染(使不同范围内的变量互不干扰)。
作用域的类型
全局作用域:常常定义在函数外部,全局作用域变量可以在任意位置访问,无需将它们作为参数传递给函数 。
局部作用域(函数作域):定义在函数内部,只能在函数中使用的变量,作用范围是从函数开始到结尾。
块级作用域:ES6 提供 let & const 变量实现块级作用域,在块级作用域之外不可引用里面的变量。
什么需要块级作用域
第一种场景:内部变量会覆盖外部变量,
第二种场景:用来计数的循环变量泄漏为全局变量,for 循环中的用 var 定义的变量在外部作用域可以访问。
作用域链(scope chain)
概念:多个作用域对象连续引用形成的链式结构。
使用方面解释:当在Javascript中使用一个变量的时候,首先Javascript引擎会尝试在当前作用域下去寻找该变量,如果没找到,再到它的上层作用域寻找,以此类推直到找到该变量或是已经到了全局作用域,如果在全局作用域里仍然找不到该变量,它就会直接报错。
存储方面解释:作用域链在JS内部中是以数组的形式存储的,数组的第一个索引对应的是函数本身的执行期上下文,也就是当前执行的代码所在环境的变量对象,下一个索引对应的空间存储的是该对象的外部执行环境,依次类推,一直到全局执行环境
变量标识符所出的作用域节点越靠近整个作用域链的前端,则需要沿作用域链迭代查找的次数就越少,让我们可以得出以下使用变量的优化点:
对于频繁引用的外部作用域的变量,可以根据情况在当前作用域内声明赋值为局部变量后使用。
减少作用域增强with语句的使用。
with的基本用法:
with语句的作用是将代码的作用域设置到一个特定的作用域中。可以快速方便修改对象里面的属性,LHS查询会产生全局变量,造成数据泄漏,性能低。
LHS查询和RHS查询的区别
如果查找的目的是对变量进行赋值,那么就会使用LHS查询;
如果目的是获取变量的值,就会使用RHS查询