闭包

闭包

定义

闭包是指有权访问另外一个函数作用域中变量的函数。 简单来说,闭包就是一个函数A内部有另一个函数B,函数B可以访问到函数A的变量方法,此时函数B就是闭包。

产生原因

当前环境中存在指向父级作用域的引用。

特征

  1. 闭包可以更新外部变量的值。

  2. 内部函数可以引用外层的参数和变量。

  3. 参数和变量不会被垃圾回收制回收。

优点

  1. 能够封装对象的私有属性和私有方法。

  2. 可以读取函数内部的变量,并且让这些变量始终保持在内存中。

缺点

闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。

解决方法:在退出函数之前,将不使用的局部变量全部删除

经典问题

for(var i = 0; i < 3; i++) {
    setTimeout(function() {
        console.log(i);
    }, 1000);
}
//结果为 3 3 3


//利用IIFE(立即执行函数表达式)构建闭包解决var没有块级作用域的问题
for(var i = 1;i < 3; i++){
    (function (i) {
        setTimeout(()=>{
            console.log(i);
        })
    })(i)
}
//结果为 0 1 2 


for(let i = 0; i < 3; i++) {
    setTimeout(function() {
        console.log(i);
    }, 1000);
}
// 结果为 0 1 2 
// 每个 let 和代码块结合起来形成块级作用域,当 setTimeout() 打印时,会寻找最近的块级作用域。


//给定时器传入第三个参数, 作为timer函数的第一个函数参数
for (var i = 0; i < 5; i++) {
    setTimeout(function (j) {
        console.log(j);
    }, 0, i);
}

评论(0)

评论