JavaScript中的闭包

一、闭包的基本概念:

闭包就是能够读取其他函数内部变量的函数。

 

二、JavaScript产生闭包的原因:

1.作用域链:JavaScript的作用域分为全局作用域、函数作用域、块级作用域。在JavaScript中,外部作用域无法直接访问内部作用域,内部作用域可以直接访问外放作用域。在JavaScript中,自由变量的查找,是在函数定义的地方,向上级作用域查找,而不是在执行的地方;在所有情况下都是如此,不仅仅是在闭包的情况下。作用域一层层嵌套,形成作用域链。

2.垃圾回收机制:JavaScript拥有自动的垃圾回收机制,当一个值,在内存中失去引用时,垃圾回收机制会根据特殊的算法找到它,并将其回收,释放内存。函数的执行上下文,在执行完毕之后,生命周期结束,那么该函数的执行上下文就会失去引用。其占用的内存空间很快就会被垃圾回收器释放。可是闭包的存在,会阻止这一过程。

 

三、闭包形成的条件:

1.函数嵌套

2.内部函数引用外部函数的局部变量

 

四、闭包分为两种情况:

 

1.函数作为返回值

// 函数作为返回值
function create() {
    const a = 100
    return function () {
        console.log(a)
    }
}

const fn = create()
const a = 200
fn() // 100
function F1() {
  var a = 100
  return function () {
      console.log(a)
  }
}
function F2(f1) {
  var a = 200
  console.log(f1())
}
var f1 = F1()
F2(f1)

// 100
// undefined

 

2.函数作为参数 

// 函数作为参数被传递
function print(fn) {
    const a = 200
    fn()
}
const a = 100
function fn() {
    console.log(a)
}
print(fn) // 100

 

五、实际开发中闭包的应用:

1.闭包作为回调函数,做事件处理,比如截流函数和防抖函数

2.Promise中用到了闭包

3.创建私有变量,减少全局变量,防止变量名污染

 

六、清除闭包的方法:

将不需要的函数名赋值为null

 

七、总结:

1.解释闭包:一个函数执行完后,它的作用域会被清理,它占用的内存会被回收。闭包是一个函数内部的子函数,它需要访问它上级函数作用域中的变量,这时上级函数执行完后其作用域不会被清理,会一直缓存在内存中,直到闭包不存在为止。

2.闭包的作用:闭包可以缓存上级作用域,使函数外部可以通过闭包访问函数内部的变量。

 

posted @ 2021-05-06 10:02  starlog  阅读(206)  评论(0编辑  收藏  举报