js重的作用域、作用域链和闭包

作用域:作用域是可访问变量的集合,也就是一个变量的可使用范围。作用域是在声明是就确定的而不是执行时。
作用域有全局作用域、局部作用域、块级作用域

重点讲一下es6的块级作用域原理:
块级作用域是使用非函数外使用{}包裹起来的代码,例如:if{}和try{}cantch{}语句;由let和const引入变量具有块级作用域属性。
上面一章我们讲到啦执行上下文,块级作用域就是一个单独的执行上下文,结合let和const声明的变量存放的位置是词法环境,而var声明的变量是在变量环境中,当js引擎查找某个变量时,会先在词法环境的栈顶向下进行查找,如果没有,再去变量环境中查找,

总结:块级作用域是通过词法环境的栈结构来实现的,变量提升是通过变量环境来实现的。

作用域链:当访问某个变量,会先在当前作用域中查找,如果没有,则向上一层作用域中进行查找,以此类推,直到找到该变量或到达window为止,这种链式查找方式我们称为作用域链。
作用域链的作用:它保证了对执行环境有权访问的所有变量或函数的有序访问。

闭包:函数A内部有函数B,函数B可以访问函数A内部的变量,那么函数B就是闭包。闭包的原理便是原型链。
闭包的特性:
1.函数嵌套函数;
2.函数内部可以访问外部函数的参数和变量;
3.参数和变量不会被垃圾回收机制回收。

闭包的优点:
1.数据封装和私有变量保护:通过闭包我们可以创建私有变量,这些变量只能在函数内部被访问和修改,外部无法直接访问,这样可以隐藏数据细节,提高代码安全性,避免全局污染
2.数据持久型:闭包允许内部函数持续访问外部函数的变量,即使外部函数已经执行完毕,这对保持数据状态非常有用
3.加强模块化编程:闭包可以将相关的变量和函数封装在一起,提高代码的可重用性和可维护性。

闭包的缺点:
1.使函数内部变量存在内存中,导致内存消耗大;
2.滥用闭包会导致内存泄漏;
3.可以在父函数外部改变父函数内部的值,所以需要谨慎操作。

全局污染:通常指的是全局作用域中的变量、函数或对象被意外地修改或覆盖,导致程序行为变得不可预测或出现错误的情况。

垃圾回收机制:js使用自动收集的方式管理内存,常见的有标记清除法和引用计数法

标记清除法:将所有变量添加标记,没有标记的将会被清除
引用计数:给每个变量记录被引用的次数,为0的便会被回收

内存泄漏:指一块被分配的内存既不能使用也不能被释放,直到浏览器进程结束。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值