js闭包

js闭包是一个面试必备考点;几乎所有前端面试都会问到这个问题,我根据自己的理解和总结对闭包的相关内容进行总结,分为以下几个方面呢:

  • 什么是闭包
  • 闭包的优点
  • 闭包的缺点
  • 闭包的适用场景
  • 闭包不适用场景

闭包

JavaScript 的闭包可以看做是一个作用域(scope),而这个作用域内部的函数访问或者可以修改这个作用域内的所有变量;并且在作用域的外面,可以调用随时内部函数;

优点

  • 封装变量,限制变量的作用域
  • 通过特权函数来访问或者修改作用域内变量
  • 使变量常驻内存

    缺点

  • 闭包会影响性能,导致变量无法回收,造成内存泄漏

    适用场景

  • 闭包可以用来模拟块级作用域
  • 闭包可以在对象中创建私有变量

    不适用场景

  • 闭包最好不要和循环同时使用。因为闭包内的变量是保存变化的,如果创建了闭包之后再使用函数的话,循环里的i可能一直会是最后一个值;
    不过有解决方法:

    for (var i = 0; i < 5; i++) {
        window.setTimeout(function(j){
            return function(){
                console.log(j);
            }
        }(i),1000);
    }
    

    这样将事件函数进行封装并返回,每一个事件函数和相应的i值都会用于自己独立的作用域,就不会引用for循环中的i值了。

  • 如果夜歌函数不需要使用闭包,那就最好不要在一个函数中创建函数