闭包

闭包指能够访问另一个函数作用域的变量的函数。

function outer() {
    var num = 0;
    var add = function () {
        num++;
        console.log(num);
    }

    return add;    // 就是一个闭包函数,因为他能够访问到outer函数的作用域
}

特性

  • 封装对象的私有属性和私有方法
  • 避免全局变量的污染
  • 参数和变量不会被垃圾回收机制回收,使用不当会造成内存溢出的问题

应用

经典面试题

for (var i = 1; i < 5; ++i) {
    setTimeout(function() {
        console.log(i);
    }, i * 1000);
}

因为 setTimeout 是异步回调,当触发时,i已经是5了,所以最后,输出4个5。

要使输出 1, 2, 3, 4,可以这么去修改,

  1. 利用立即执行函数创建作用域

    for (var i = 1; i < 5; ++i) {
     (function(sec) {
         setTimeout(function() {
             console.log(sec);
         }, sec * 1000);
     })(i);
    }
    
  2. let

    for (let i = 1; i < 5; ++i) {
     setTimeout(function() {
         console.log(i);
     }, i * 1000);
    }
    

高级应用

Copyright & copy https://www.zhuyuntao.cn 2019 all right reserved,powered by Gitbook该文件修订时间: 2019-11-03 12:36:28

results matching ""

    No results matching ""