关于闭包,我会想问:闭包咋来的(来源),闭包是啥(概念),闭包存在在什么地方(结构),闭包怎么用,闭包优缺点..顺着这“一条龙”的问法,来串串闭包的历史,就像老师讲历史一样,有问题才有进步,有需求才有市场嘛,不扯了开敲..
1.闭包是咋来的:
函数中的变量,有全局变量和局部变量之分,全局变量能在函数的任何地方被访问(易污染),局部变量只能沿作用域链向上访问却不能在函数外部访问(人家不易被污染),且函数执行完,局部变量将被释放(不可重用)。
so.为了解决全局的易污染、局部的不可重用,soso.闭包就来了...
2.闭包是啥:
闭包是一个能够读取其他函数局部变量的函数。先抛一个大神写的例子:
function tea(){
var n=1;
function blackTea(){
console.log(n++);
}
return blackTea;
}
var Tea = tea();
Tea();
Tea();
这例子里的blackTea函数就是闭包了。换匿名写法:
function tea(){
var n=1;
return function (){
console.log(n++);//这个n是内层函数向上访问外层函数的局部变量而来的,做到了复用局部变量
}
}
var Tea = tea();
Tea();
Tea();
3.闭包存在在什么地方:
直接看blackTea函数存在在整个大函数的位置。
4.闭包怎么用:再上一个例子好了
var type = "the flowers";
var girls_accept = {
type : "the grass",
whoAccepts : function(){
return function(){
return this.type
}
}
}
var accept = girls_accept.whoAccepts();
accept();
-------------------------------------------------------------------------------------------------------
var type = "the flowers";
var girls_accept = {
type : "the grass",
whoAccepts : function(){
var that = this; ====> //非常重要:外层函数要申明这个变量,确定为外层函数的局部变量
return function(){
return that.type
}
}
}
var accept = girls_accept.whoAccepts();
accept();
5.闭包的优缺点:内存易泄露:==>易造成内存泄露问题(<==var申明变量却没使用、定时器中任务函数直接是字符串等)。
性能问题