通俗地理解javascript闭包

定义

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


通俗的说:JavaScript中全部的function都是一个闭包闭包

案例解读

  • 基本案例函数

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

var bar=foo();

运行结果

这里的foo运行后返回了一个函数,这个函数拥有一个本身私有的变量i,这个变量i不会由于foo运行结束了就被销毁。
返回的这个函数被赋值给bar,这个bar就是一个闭包,它的特征是拥有本身的私有成员,该例子中私有成员是变量i,这个私有成员能够是一个函数spa

  • 带有循环的闭包3d

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都是这个icode

  • 循环生成闭包而且拥有真正的本身iblog

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,因此它们各是各的图片

总结

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

每一个家庭就比如一个闭包函数,不一样的家庭有不一样的老婆、老公、孩子,他们的名字甚至也能够是同样的,而后每一个家庭是独立的。it

相关文章
相关标签/搜索