作用域和作用域链的理解

什么是作用域:

就是变量或者是函数能作用的范围。

为什么作用域很重要:

使变量不被污染(使不同范围内的变量互不干扰)。

作用域的类型

全局作用域:常常定义在函数外部,全局作用域变量可以在任意位置访问,无需将它们作为参数传递给函数 。
局部作用域(函数作域):定义在函数内部,只能在函数中使用的变量,作用范围是从函数开始到结尾。
块级作用域:ES6 提供 let & const 变量实现块级作用域,在块级作用域之外不可引用里面的变量。

什么需要块级作用域

第一种场景:内部变量会覆盖外部变量,
第二种场景:用来计数的循环变量泄漏为全局变量,for 循环中的用 var 定义的变量在外部作用域可以访问。

作用域链(scope chain)

概念:多个作用域对象连续引用形成的链式结构。
使用方面解释:当在Javascript中使用一个变量的时候,首先Javascript引擎会尝试在当前作用域下去寻找该变量,如果没找到,再到它的上层作用域寻找,以此类推直到找到该变量或是已经到了全局作用域,如果在全局作用域里仍然找不到该变量,它就会直接报错。
存储方面解释:作用域链在JS内部中是以数组的形式存储的,数组的第一个索引对应的是函数本身的执行期上下文,也就是当前执行的代码所在环境的变量对象,下一个索引对应的空间存储的是该对象的外部执行环境,依次类推,一直到全局执行环境

变量标识符所出的作用域节点越靠近整个作用域链的前端,则需要沿作用域链迭代查找的次数就越少,让我们可以得出以下使用变量的优化点:
对于频繁引用的外部作用域的变量,可以根据情况在当前作用域内声明赋值为局部变量后使用。
减少作用域增强with语句的使用。

with的基本用法:

with语句的作用是将代码的作用域设置到一个特定的作用域中。可以快速方便修改对象里面的属性,LHS查询会产生全局变量,造成数据泄漏,性能低。

LHS查询和RHS查询的区别

如果查找的目的是对变量进行赋值,那么就会使用LHS查询;
如果目的是获取变量的值,就会使用RHS查询

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值