js中变量的作用域
了解闭包首要要了解js变量的作用域
* 函数内部可以直接读取全局变量
* 在函数外部自然无法读取函数内的局部变量
function f1(){
var n=a;
}
alert(a); // undefind
- 父对象的所有变量,对子对象都是可见的
function f1(){
var n=1;
function f2(){
alert(n); // 1
}
}
- 访问内部变量通过return
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
什么是闭包
我的理解就是定义在函数内部的函数。
闭包的优点
- 外部访问内部函数的变量
- 产生常驻内存,不被回收
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
解析:
f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收
闭包的缺点
- 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大
闭包会在父函数外部,改变父函数内部变量的值