闭包(closure)是Javascript的一大难点,也是它的特色。很多高级应用都要依靠闭包来实现。
要理解闭包,需要先了解[ 变量作用域 ] :全局变量和局部变量

一:含义

在本质上,闭包是将函数内部和函数外部连接起来的桥梁

function f1(){
    var n=999;
    function f2(){
      alert(n); 
        // n = 999
  }
}

在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。
但是反过来就不行,f2内部的局部变量,对f1就是不可见的,fn2就是闭包。


二:原理

闭包只有在被调用时才执行操作,所以它可以被用来定义控制结构。
多个函数可以使用同一个环境,这使得他们可以通过改变那个环境相互交流。


三:优缺点

优点:
(1)逻辑连续,当闭包作为另一个函数调用参数时,避免脱离当前逻辑而单独编写额外逻辑。
(2)方便调用上下文的局部变量。
(3)加强封装性,是第2点的延伸,可以达到对变量的保护作用。

缺点:
(1)内存消耗很大,会造成网页的性能问题,在IE中可能导致内存泄露,在退出函数之前,将不使用的局部变量全部删除
(2)闭包会在父函数外部,改变父函数内部变量的值,不要随便改变父函数内部变量的值。


四:场景

(1)采用函数引用方式的setTimeout调用

原生的setTimeout有一个缺陷,你传递的第一个函数不能带参数,即 “ setTimeout(func(parma),1000) ”;
这样的语句是不生效的(不过在不同浏览器中有不同的错误,总之都无法达到预期效果)

这时,我们就可以用闭包来实现这个效果了,如下:
function func(param) {
    return function() {
        alert(param);
    }
}
var f = func(1)
setTimeout(f, 1000);

(2)将函数关联到对象的实例方法。

(3)封装相关的功能集。