2

闭包含义:

闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在
一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。

这个时候我们就要谈到匿名函数了.


匿名函数

匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数。看例子:

function box () {    //这是一个普通函数
    return 'anonymous';    
}
alert(box());

那么匿名函数是什么呢?看例子:

function () {
    return 'anonymous';
}

这个函数并没有执行!!!
如果让匿名函数执行呢。我们可以将匿名函数赋值给一个变量:

var box = function (){
    return 'anonymous';
};
alert(box());    //anonymous

但是这种表达式有时候并没有什么含义,那我们可以用自执行的方法去调用匿名函数:

(function () {
    alert('anonymous'); 
})();

匿名函数如何传参呢?看例子:

(function (a) {
    alert(a);
})(100);    //alert返回100

匿名函数和闭包的作用

谈到闭包,我们就不得不谈到全局变量和局部变量。

全局变量:

全局变量在实际写项目中个人额不建议使用,因为大量的全局变量会污染代码,每个模块都可以去地道用,必将引来很多错误。所以推荐变量私有化

什么是变量私有化?

var a = 100;    //全局变量

function box () {
alert(a);
}
box();    //调用函数返回100

通过上面的代码可以看出,每个函数内都可以调用外部的局部变量。将a变量变成了公有化的变量,有时候我们并不希望这么做。所以我们可以将变量定义在函数内部使变量变成私有化变量,外部无法访问到这个变量

function box () {
    var a = 100;    //局部变量
}

alert(a);    //a is not defined

这就完事了么?并没有!!记住一点:局部变量在每次调用时都会初始化!!!(重要的事情用三个感叹号...)
我们来用一个后置递增的一个小例子来告诉大家:

function a () {
    var b = 100;
    b++;
    return b;
}
alert(a());    //101
alert(a());    //101

不难看出,每次调用,变量b都会被初始化,所以每次调用都会返回101而不是累加。我们可以用普通函数内部嵌套匿名函数,形成一个闭包来使变量驻留在内存中。

function a () {
    var b = 100;    //局部变量
    return function () {    //闭包
        b++;
        return b;
    };
}
var c = a();
alert(c());    //101
alert(c());    //102

为什么要将a()赋值给变量c呢?这里我们就要谈到匿名函数调用问题:
匿名函数如何调用?还是上面的例子:

function a () {
    var b = 100;
    return function () {
        return b;
    };
}
alert(a());    //会将整个函数体打印出来
alert(a()());    //这样才调用了函数内部的匿名函数

看到这里。大家应该理解了为什么要将a()赋值给c变量了吧?因为如果直接使用a()();这样去调用,每次调用还是会初始化局部变量,而我们赋值给变量c,外层函数被调用了一次赋值给了C,而每次调用C去调用内部的匿名函数,从而达到了闭包。

我会在下一章继续讲闭包,欢迎大家来纠正错误及指正!

                                                            Brian Lee

Brian_Lee
397 声望40 粉丝

人生为棋,我愿为卒,行动虽慢,可谁见我曾后退一步!