基础-函数2(闭包)
以前面试经常会碰到闭包的题,说实话,答的时候都是临时看的死记硬背的一些概念说法,说完就忘,笔试的话也有一些题都是半猜的..
本文记录闭包的机制,只为加深下理解,欢迎各路大侠吐槽~
在闭包之前,还有个小概念要提下:
1. 内部函数:
如果某个函数依赖于其他的一两个函数,而这一两个函数对你其余的代码也没有用处,那么可以将它们嵌套在会被调用的那个函数内部;
这样做可以减少全局作用域下的函数数量,也叫局部全局local global.
嵌套函数(指内部函数)<--对应-->容器函数(指外部函数),内部函数是外部函数私有的
2.闭包:
上标本:
function outer(a){
return function(b){
return a+b;
}
}
x = outer(5);
y = outer(10);
x(6);
y(7);
答题:(像列数学竖式一样,一步步来)
x = outer(5) = function(b){return 5+b;} = 5+b; --> x(6) = 5+6 =11;
y = outer(10) = 10+b; --> y(7) = 10+7 = 17;
but,用编程的思维,what's happend?
简单的说,闭包可以记忆创建时的环境和变量状态;
仔细的说,每当javascript执行一个函数时,都会创建一个作用域对象scope object,用来保存这个函数中创建的局部变量;
当,调用outer时,解释器创建了一个作用域对象,它带有一个属性:a,这个属性被当作参数传入;
然后,outer返回一个新建的函数,通常javascript的垃圾回收机器会在这时回收outer创建的作用域对象;
(垃圾回收机制:在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。
如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。
因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。)
但是,返回的函数却保留一个指向那个作用域对象的引用;
结果,就是这个作用域对象不会被回收,直到指向outer返回的那个对象的引用计数为0.
晕了么,多读几遍..
再简单的说,
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
(感觉吧就像,我是小卖部老板,小卖部是外部函数,我是内部函数,就是主角闭包,隔壁家小孩是外部调用;
小孩来买东西,只有我有权限拿小卖部里的东西,然后我喊小孩来买,把小卖部里的东西卖给它;
如果没有人买,我和我的店就要被关门回收)

浙公网安备 33010602011771号