关于闭包的理解(JS学习小结)
前言:
啊啊啊,看书真的很痛苦啊,还是好想做项目写代码才有意思,不过我现在缺的确是将知识体系化,所以不论看书多么痛苦都一定要坚持坚持啊,这才是我现在最需要的进步的地方,加油!
因为现在期末啦,下周一也就是明天开始就有考试,所以复习是主要的事情,看书的速度比较慢了,一周大概也就184页(P110-P284), 虽然页数比较少但是其中有ES中非常最重要的两个概念——原型链和闭包,之前对于两个知识的了解算是知其然不知其所以然的,所以在那两章我也有意多花费了时间,确保我能够吃透这个概念。以下算是我自己的一些理解,如果有不很正确的地方,希望大神们多多指教,康桑阿米达~
哦,对了,我看的JS书是《Javascript 高级程序设计(第3版)》,如果有正在看这本书的小伙伴可以一起哇~大家多多交流,互相学习嘛~
正文:
现在最流行的编程语言里面一定有“对象”的概念,我们的第一节实验课老师就叫我们怎么找对象,所以可见对象对于程序猿的重要性,所以你有对象了嘛?:) 那这世界上对象千千万,我们怎么知道哪个对象合适呢?总不能一个一个的相处试试看吧?好在我们发现很多对象都有相似之处,所以我们将他们相似的部分抽象出来,形成了一个全新的概念,在我们需要的时候,比对我们的需要和这个概念,再进行选择,就会节省我们很多功夫并更好更快的获得我们想要的结果。而这个概念在JS中就是引用类型,Object(JS中没有类的概念,如果学过C++或者Java、C#等语言的,那也会很容易就对应get到JS中引用类型的)。Object确实是JS中非常强大的部分,但却不是最有意思的,那最有意思的是什么?Function。
在JS中,Function也是一个Object的一个对象。而关于这个概念的延伸,像是继承、原型链等等就又可以再开一把了,如果实在是饥渴难耐的,那就快去搜索大神们博客或者找一本《JavaScript高级程序设计》和我一起学习啦~所以,我们现在就将矛头对准,闭包!开火,嘣嘣嘣嘣
在说闭包的概念之前,我们总得知道这个名词到底是什么意思吧?
所以什么是闭包?函数。
既然就是函数为什么又特别要取个名字?它到底特别在哪?
能够访问另一个函数作用域中的变量。(此处的作用域姑且理解为{}之内)
For example,上个例子就知道了,不要问我例子是谁
function outerFunc(arg){ return function innerFunc(){ alert(arg); } }
此处名为outerFunc的函数返回了一个名为innerFunc函数,这个函数在内部只有一句“alert(arg);”,可是运用技能一眼看穿法,找不到arg,再往上,哇哦,在outerFunc的参数那找到了呢,真开心。所以这个innerFunc(函数)访问了outerFunc(另一个函数)作用域内(在outerFunc的{}中,但没在innerFunc的{}中)的变量(arg),所以这个innerFunc就是一个闭包。(大多数时候,不会为闭包命名,此处只为更好的说明。)
OK,闭包的概念知道啦,那如何形成闭包这个现象的呢?显然刚刚别有深意,欲拒还迎的作用域使的小把戏啦,别怕,我们立马拿下。
“当某个函数被调用时,会创建一个执行环境及相应的作用域链。”
“每个执行环境都有一个表示变量的对象——变量对象。(variable object)。”
当然还是要先名词解释,要是都不知道这个名词指的什么,那还怎么玩。
作用域:也就是变量对象的别称。
作用域链:就是作用域和链呗。一条把作用域像腊肉穿起来的链子。它只是一条链子所以作用域链就只保存着变量对象的地址,而不是变量对象本身。
执行环境:执行环境指向自己独有的作用域链,作用域链又按照当前函数作用域,外部函数作用域,外部函数的外部函数作用域....直至全局作用域。
1 function outerFunc(arg){ 2 3 return function innerFunc(){ 4 alert(arg); 5 } 6 7 } 8 9 var result = outerFunc(1); //返回innerFunc函数 10 result(); //输出1
还是刚才的函数,还是原来的配方,再加点料,看看效果。