闭包含义:
闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在
一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。
这个时候我们就要谈到匿名函数了.
匿名函数
匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数。看例子:
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。