1.什么是闭包?
1.1.定义:
在程序语言中,所谓的闭包,是指语法域位于某个特定的区域,具有持续参照(读写)位于该区域内自身范围之外的执行域上的非持久性变量值能力的段落。这些外部执行域的非持久性变量保留它们在闭包中最初定义时的值。
简单的理解:闭包就是能够读取其他函数内部变量的函数。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
1.2、闭包的作用:
它的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中(不产生全局变量,可以实现属性私有化;)。
1.3.闭包的缺点
闭包中的数据会常驻内存,在不使用的时候要删除,否则会导致内存溢出。
2.闭包的进一步理解
闭包只能取得包含函数中任何变量的最后一个值。
闭包保存的是整个变量对象,而不是某个特殊的变量。
例子1:
function createFunctions() {
var result = new Array;
for (var i = 0; i < 10; i++) {
result[i] = function() {
return i;
}
}
return result;
}
这个函数会返回一个函数数组。表面上看,似乎每个函数都应该返回自己的索引值,但实际上,每个函数返回的都是10。
因为每个函数的作用域链中,都保存着createFunctions()函数的活动对象。所以他们引用的都是同一个变量i。
当createFunctions()函数返回以后,变量i的值是10,此时每个函数都引用着保存变量i的同一个变量对象,所以,在每个函数内部变量i的值都是10。
例子2:
function createFunctions() {
var result = new Array;
for (var i = 0; i < 10; i++) {
result[i] = function(num) {
return function() {
return num;
};
}(i);
}
return result;
}
在这个例子中,我们没有直接把闭包赋值给数组,而是定义了一个匿名函数,并将立即执行匿名函数的结果赋值给数组。。
这里的匿名函数有一个参数num,也是最终的函数要返回的值。
在调用每个匿名函数时。我们传递了变量i。由于参数是按值传递的,所以就会将变量i的当前值,复制给参数num。
而在这个匿名函数的内部,又创建并返回了一个访问num的闭包。
这样一来,result数组中的每个函数都有自己num变量的一个副本。
因此,就可以返回各个不同的数值了。
网友评论