什么是闭包
普通函数中,函数内部可以直接读取全局变量,函数外部无法读取函数内部的局部变量。
而闭包能够读取其他函数内部变量的函数,由于在 Javascript 语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成 “定义在一个函数内部的函数”。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
闭包的用途:
-
可以在函数外部读取函数内部成员
让函数内成员始终存活在内存中
一些关于闭包的例子
示例1:
function fn() {
var n = 10;
function fn_son() {
console.log(n);
}
}
//函数fn_son被包括在函数fn内部,这时fn内部的所有局部变量对fn_son都是可见的。
但是反过来就不行,fn_son内部的局部变量对fn是不可见的。
示例2:
function fn1() {
var n = 100;
return function fn1_son() {
var a = 50;
return a;
}
}
var f1 = fn1();
console.log(f1());
//将内部函数作为返回值,此时会在控制台打印50,此时fn1函数可以访问到内部函数fn1_son的局部变量a
示例3:
function getRandom() {
var random = parseInt(Math.random() * 10 + 1);
return function() {
return random;
}
}
var fn = getRandom();
console.log(fn());
//可以说 闭包就是在一个函数内可以访问另一个函数内的局部变量
//上述代码段结果是在控制台 随机打印一个(0-9)之间的值
注意点
1.由于闭包会使函数中的变量都保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在 IE 中可能会导致内存泄漏。解决方法是,在退出函数时,将不使用的局部变量全部删除。
2.闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象使用,把闭包当作它的公用方法,把内部变量当作它的私有属性,这时一定要小心,不要随便改变父函数内部变量的值。
3.闭包只能取得包含函数中任何变量的最后一个值。