zoukankan      html  css  js  c++  java
  • js高级-作用域和闭包

    作用域(scope):
    变量和函数能作用的范围,一块代码区域。
    用于确定在何处以及如何查找变量的一套规则。

    分为:全局全用域和局部作用域,以及块级作用域(es6新增)
    全局作用域:整个script标签或者一个单独的js文件
    局部作用域:在函数内的就是局部作用域

    用途:
    提高程序可靠性;隔离变量,不同作用域下的同名变量不会冲突

    全局变量:在全局作用域下定义的变量,只有在浏览器关闭时才销毁,比较占用内存。
    局部变量:函数内定义的变量,包括形参也是局部变量,当函数调用完毕即销毁。

    作用域嵌套:
    当一个函数或块嵌套另一个函数或块的时候,就发生了作用于嵌套。
    作用域链:
    发生作用域嵌套时,由多个作用域变量对象构成的链表,叫作作用域链。
    查找嵌套作用域链规则:js引擎查找变量的时候的会先从当前作用于查找,如找不到则从上一级作用于查找,当抵达最外层全局作用于时,无论找到还是找不到都会停止。
    如果查找目的是赋值,js会使用LSH查询;如果目的是获取值,会使用RSH查询。
    赋值操作会导致LHS,=操作或调用函数时传入参数的操作会导致RHS查询。不成功的RSH查询会导致ReferenceError异常,不成功的LSH会隐士创建一个全局变量(非严格模式下),或者抛出ReferenceError异常(严格模式)。

    闭包:
    函数在当前作用域之外执行时,这是就产生了闭包。内部函数持有外部函数作用域的引用,这个引用就是闭包。

    一般情况下,当一个函数被调用后,其内部的整个作用域都会被销毁。因为引擎有垃圾回收器来释放不再使用的空间。但是闭包可以阻止这件事情发生。

    作用:
    延长局部变量的生命周期

    闭包应用:
    循环遍历加监听
    模块化: 封装一些数据以及操作数据的函数, 向外暴露一些行为
    JS框架(jQuery)大量使用了闭包

    缺点:
    变量占用内存的时间可能会过长
    可能导致内存泄露
    解决:
    及时释放 : f = null; //让内部函数对象成为垃圾对象

  • 相关阅读:
    Nginx在linux环境下(centos7)的安装、负载均衡设置
    ocr识别开源软件tesseract试用记录
    Nginx在windows环境下的安装、负载均衡设置
    一个测试程序迭代的故事05
    一个测试程序迭代的故事04
    一个测试程序迭代的故事03
    一个测试程序迭代的故事02
    一个测试程序迭代的故事01
    Delphi5和Delphi7属性编辑器内存泄漏问题的解决
    使用Calibre自带工具批量转换电子书格式
  • 原文地址:https://www.cnblogs.com/tingshu/p/15227438.html
Copyright © 2011-2022 走看看