闭包

64 阅读1分钟

什么是闭包

作用域分为全局作用域和局部作用域,函数产生的作用域为局部作用域,一般函数执行完就会被清理、内存也会被回收。但是有一个例外,如果这个函数返回一个内部函数并且对外暴露了外部函数的属性和方法,那么这个函数将常驻于与内存中执行完后也不会被自动清理,这个时候就产生了闭包。

经典场景

1、return一个内部函数,读取内部函数的变量

function fn1() {
    let n = 1;
    reutrn function fn2() {
        console.log(n);
    }
}

// 或者

function fn() {
    let n = 1;
    return () => {
        console.log(n)
    }
}

2、函数作为参数

3、自执行函数

let n = 1;
(function fn(){
  console.log(n);
})()

4、ajax的回调,自定义事件的回调,setTimeout的回调

案例题目

for (var i = 0; i < 6; i++) {
  setTimeout(() => {
    console.log(i)
  })
}
这样会打印出66

`解决方法`
// 方法一:通过let锁死暂存区
for (let i = 0; i < 6; i++) {
  setTimeout(() => {
    console.log(i)
  })
}
// 方法二:通过自执行函数实现闭包
for(var i = 0; i < 6; i++){
  (function(j){
       setTimeout(function(){
        console.log(j)
    }) 
  })(i)
}