将函数作为返回值使用的场景大多是闭包,这也是前端极具话题性的一项技术。

MDN 定义闭包为能够访问自由变量的函数。其中自由变量指既不是函数参数也不是函数的局部变量的变量。理论上所有的函数都是闭包。

但实际上我们说的闭包是指引用了上下文被销毁了的函数内部变量的函数。

闭包的本质就是:指有权访问另一个被销毁函数作用域的函数中的变量的函数。

闭包的作用域链包含着它自己的作用域,以及包含它的函数的作用域和全局作用域

作用:

  • 延长局部变量的生命周期
  • 让函数外部能操作内部的局部变量

缺点:

  • 变量占用内存的时间可能会过长,可能导致内存泄露

题目1:

function makeCount(){
    var count = 0;
    return function (){
        return count ++;
    }
}
let count1 = makeCount();
let count2 = makeCount();

console.log(count1());  // 
console.log(count1());  //
console.log(count2());    //

题目2:

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

// 输出结果 依次是 1,2,3,4,5 吗????