学习Javascript闭包

看了很多博客,闭包被定义的非常抽象,很难看懂。
我的理解,闭包就是外部能够读取其他函数内部变量的函数。

首先,就要了解作用域。
Javascript作用域分为两种:全局作用域局部作用域(函数作用域)

而由于特殊的作用域链,子函数内部可以读取父函数(全局作用域)的变量。
另一方面,父函数却无法读取子函数作用域内部变量。

var x=000;
function demo1(){
    alert(x);       //子函数访问全局作用域中的x
}
demo1();    //000

function demo2(){
    var x=000;
}
alert(x);           //错误 函数外部无法访问函数内局部变量

要使函数外部读取函数内的局部变量,可以通过在函数(demo1)内部再定义一个函数(demo2)并将其(demo2)作为返回值,

function demo1(){
    var x=000;
    function demo2(){
        alert(x);
    }
    return demo2;
}
var result=demo1();
result();   //000

在上面的代码中,函数demo2定义在函数demo1内部,这是demo1内部的局部变量demo2都可以访问到,但如果不将demo2作为返回值,反过来demo1就无法访问demo2的内部局部变量。
这是因为Javascript的 链式作用域结构:每当创建一个子函数,子函数就会沿着作用域链一级一级的向上寻找并访问到父函数的局部变量。反之,子函数内部的局部变量对父函数都是不可见的。
所以代码中的demo2函数就是闭包,它允许父函数访问子函数内部的局部变量。

闭包的用途
闭包的作用有两个:一是可以使父函数读取子函数内部的局部变量,二是让这些变量始终保存在内存中,在调用结束后不会被垃圾回收机制回收。

本文总阅读量