6

定义

闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。。(百度百科)


通俗的说:JavaScript中所有的function都是一个闭包

案例解读

  • 基本案例

function foo() {
    var i = 0;
    return function() {
        return ++i;
    }
}

var bar=foo();

运行结果

这里的foo运行后返回了一个函数,这个函数拥有一个自己私有的变量i,这个变量i不会因为foo运行结束了就被销毁。
返回的这个函数被赋值给bar,这个bar就是一个闭包,它的特征是拥有自己的私有成员,该例子中私有成员是变量i,这个私有成员可以是一个函数

  • 带有循环的闭包

function foo() {
    var result = [];
    for (var i = 0; i < 10; i++) {
        result[i] = function(){return i};
    }

return result;
}

var bar = foo();

带有循环的闭包

现象如上,原因是循环生成了10个闭包,但是,他们的私有成员i是他们共有的,当最后一个闭包函数生成后,i的值已经等于10,而前面的闭包的i都是这个i

  • 循环生成闭包并且拥有真正的自己i

function foo() {
    var result = [];
    for (var i = 0; i < 10; i++) {
        result[i] = (function(i) {
            return function() {
                return i
            }
        })(i);仔细对比这里的区别
    }

    return result;
}

var bar = foo();

图片描述

显然,循环生成的每个闭包都真正拥有的自己私有变量,解决办法是代码中的自执行函数包裹需要生成的闭包函数,并为闭包函数提供一个独立的变量,这个时候它们的i是来自包裹它们的自执行函数的参数,而不是刚才的foo里面的那个i,所以它们各是各的

总结

闭包的用途在我看来是为函数提供私有的变量,使得数据安全,不会污染别人的变量,别人的成员,别人的老婆。

每个家庭就好比一个闭包函数,不同的家庭有不同的老婆、老公、孩子,他们的名字甚至也可以是一样的,然后每个家庭是独立的。


已注销
981 声望48 粉丝

Focus on programming efficiency