浅谈Javascript闭包和匿名函数【1】

闭包含义:闭包

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

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


匿名函数内存

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

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

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

function () {
    return 'anonymous';
}

这个函数并无执行!!!
若是让匿名函数执行呢。咱们能够将匿名函数赋值给一个变量:function

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
相关文章
相关标签/搜索