00:00/
发布于2017-09-25 / 663次浏览
要理解闭包,首先要了解变量的作用域。
就像我在之前的博客写的那样 js定义变量时,有var关键字和没var关键字有什么差别?
简单的说就是,
在函数外部
有var和没有var都表示全局变量,因为他们都是在全局环境里执行。
在函数内部
加var定义的变量是局部变量,不加var定义的就成了全局变量。
而且函数内部可以直接读取全局变量:
var n=999;
function f1(){
alert(n);
}
f1(); // 999
另一方面,在函数外部自然无法读取函数内的局部变量。
function f1(){
var n=999;
}
alert(n); // error
那么如何从外部读取局部变量呢?我们可以运用闭包:
function f1(){
n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
很抽象对吧,那就用比较直白比较容易的话来描述下:
闭包就是能够读取其他函数内部变量的函数。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成定义在一个函数内部的函数
。
闭包就是将函数内部和函数外部连接起来的一座桥梁。
一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。
function a() {
var i = 0;
function b() { alert(++i); }
return b;
}
var c = a();
c();
这里的a()执行完并返回后,没有被垃圾回收,因为a()里面的b()函数需要a()中的变量。
先写到这里吧。学到啥再补充。
最后修改于:2017年9月26日 上午11:47
闭包可以封装一个私有变量。
还有开头说的有问题,在函数内部var定义的是局部变量,外部var定义的是全局变量。
@yukun 多谢大佬提醒,文章已做修改。