JavaScript 闭包原理和闭包实现

书本上对闭包的羞涩解释:闭包(closure)是一个函数,通常也被称为闭包函数或绑定函数,该函数运行在一个特定的环境中,该环境定义了一些本地变量,当该函数被调用时,仍可以使用这些本地变量。

其实闭包的显著特征就是当一个函数在不位于它所处环境(变量作用范围)中被调用时,仍能够使用本地变量。下面来看看JavaScript中典型的两种闭包应用。


作为值从函数返回的函数

闭包函数A()位于一个特定的环境中(被嵌套在另一个函数B()中),并作为值从函数B()返回:

function B(){
    var temp="abc";    //这是一个本地变量
    function A(){    //定义一个闭包函数,将使用本地变量
        alert('闭包函数处理本地变量temp的值:'+temp);
    }
    return A;    //返回闭包函数
}

var myFun=B();        //调用函数B(),返回的是闭包函数A()
myFun();        //调用闭包函数A() 弹出“闭包函数处理本地变量temp的值:abc“

myFun()其实就是A(),它的调用是在函数B()的外边,按照常理它不应该再访问本地变量temp,但实际上仍可以访问,所以A()就是闭包函数。


利用变量作用范围也可以形成闭包函数

一般来说作为参数传递给函数的函数或作为值从函数返回的函数都是闭包函数,但利用变量作用范围也可以形成闭包函数。例如:

var F;
function B(){
    var temp="abc";    //这是一个本地变量
    F=function(){    //定义一个闭包函数,将使用本地变量
        alert('闭包函数处理本地变量temp的值:'+temp);
    }
}

B();    //调用函数B()为变量F赋值
F();    //调用闭包函数F()  弹出“闭包函数处理本地变量temp的值:abc“

可以看到,闭包函数F()的调用虽不在函数B()的局部范围内,但仍可以试用函数B()中定义的私有变量temp.

闭包函数的核心是闭包函数无论在哪里调用,都可以访问它所处环境的变量(本地、私有变量),而这个变量在闭包函数被调用环境中是被其他程序无法访问的。

匿名自执行函数是非常好利用闭包原理来实现的功能应用。


PS:感谢一下两位兄弟对在微博上对我的帮助

谁能用一句话简单明了的解释下闭包?

@司徒正美

如果一个函数返回另一个函数,而被返回函数又需要外层函数的变量时,不会立即释放这个变量,而是允许被返回的函数引用这些变量。支持这种机制的语言称为支持闭包机制,而这个内部函数连同其自由变量就形成了一个闭包。

@张耀星星

我觉得就是一个封闭的作用域,里面看得到外面,外面看不到里面。

posted @ 2012-08-06 10:02  码农神说  阅读(368)  评论(0编辑  收藏  举报