这本书《JavaScript面向对象编程指南》确实挺好,里面讲的都是核心内容,而且都是大部分面试中经常遇到的问题。
面试中经常会被问到闭包,但其实没有真正的理解。只是知道函数中包含另一个函数,内部函数可以访问外层函数的变量,然后作用就是内部函数可以一直保有这个变量,内部函数可以当做返回值,这样变量在外部也可以访问。
直接在网上搜答案确实很方便,可是不懂得其中的原理还是一头雾水,这样永远也不会进步,还是要多看书。
看了书之后才知道,一切要从作用域开始。
在JavaScript中是不存在大括号作用域的,类似if和for,在此大括号中定义的变量在外部是可访问的。
代码示例在JavaScript中是有函数作用域的,在函数中定义的变量在函数外部是不可以访问的。有一种情况是不使用var关键字定义变量的将会变成全局属性(在外部可以访问)。
代码示例用代码来理解作用域链。
代码示例在函数outer()中定义了inner()函数,inner()函数中定义deep()函数,deep()函数中可以访问自己作用域中的变量,也可以访问“父级”作用域,又可以访问“父级的父级”作用域,这就形成了一条作用域链。
接下来看下闭包,大部分内容还是来源于书上,不过也需要自己的理解。
代码示例当执行 var inner = outer(); 时,outer函数返回内部函数inner,重新赋值给了一个全局变量inner。新的inner全局函数可以访问全局空间和outer函数空间,所以能访问到变量b。
闭包图示我用了一段代码与图解来理解闭包,大部分源自书上。不过我觉得这真的难以用语言来形容,更好的还是代码,然后加上个人的理解。
还有书上的一段话:“事实上,每个函数都可以被认为是一个闭包。因为每个函数都在其所在域(即该函数的作用域)中维护了某种私有联系。但在大多数时候,该作用域在函数体执行完之后就自行销毁了——除非发生一些有趣的事,导致作用域被保持。(有趣的事就是闭包)”
所以,我觉得最核心的问题是要理解作用域。
网友评论