如何使用javascript闭包
闭包的概念:“官方”的解释是,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。?
变量的作用域:全局变量和局部变量
全局变量:函数内部可以直接读取全局变量
??????????? var n=999;
????????????function f1(){
????????????? alert(n);
?????????? }
??????????? f1(); //999
局部变量:函数外部自然无法读取函数内的局部变量?
??? function f1()
??? { var n=999;
??? }
alert(n); // error
注意:申明内部变量的时候,一定要写var,否则,它就是一个全局变量?
如何从外部读取局部变量?
?? 只有在函数的内部再定义一个函数:
function function A()
{
var n=999;
function B()
??{
alert(n); // 999
}
}
既然B可以读取A中的局部变量,那么只要把B作为返回值,我们不就可以在A外部读取它的内部变量了吗!
???? function A()
???? {
var n=999;
function B()
??? ?{
??? alert(n);?
? }
return B;
}
var result=A();
result(); // 999?
此时,B函数就是一个闭包.
闭包的简单概念:
闭包就是能够读取其他函数内部变量的函数。?
???????????? 函数内部的函数闭包的两个最大的作用
读取函数内部的变量?
变量的值始终保持在内存中?
function A()
{
var n=999;
nAdd=function(){n+=1}
function B()
?????????? {
??????????? alert(n);
?????? }
return B;
}
var result=A();
result(); // 999
nAdd();
result(); // 1000
注意:函数A中的局部变量n一直保存在内存中,并没有在A调用后被GC回收 .
?闭包的缺陷
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,可能导致内存泄露?
? 解决方法是,在退出函数之前,将不使用的局部变量全部删除。
?总结:
JavaScript中的闭包函数,是不接受任何形参的,它的值,从执行环境中来
闭包中的变量是存在内存中的,并不会被GC回收
闭包中的变量对内存的消耗很大,乱用会导致内存泄漏的可能
?
?