基础-函数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)。

(感觉吧就像,我是小卖部老板,小卖部是外部函数,我是内部函数,就是主角闭包,隔壁家小孩是外部调用;

小孩来买东西,只有我有权限拿小卖部里的东西,然后我喊小孩来买,把小卖部里的东西卖给它;

如果没有人买,我和我的店就要被关门回收)

posted @ 2015-12-04 17:43  luella  Views(267)  Comments(0)    收藏  举报