美文网首页
作用域、作用域链和闭包

作用域、作用域链和闭包

作者: 垃圾中的垃圾 | 来源:发表于2021-07-14 15:40 被阅读0次

        这本书《JavaScript面向对象编程指南》确实挺好,里面讲的都是核心内容,而且都是大部分面试中经常遇到的问题。

        面试中经常会被问到闭包,但其实没有真正的理解。只是知道函数中包含另一个函数,内部函数可以访问外层函数的变量,然后作用就是内部函数可以一直保有这个变量,内部函数可以当做返回值,这样变量在外部也可以访问。

        直接在网上搜答案确实很方便,可是不懂得其中的原理还是一头雾水,这样永远也不会进步,还是要多看书。

        看了书之后才知道,一切要从作用域开始。

        在JavaScript中是不存在大括号作用域的,类似if和for,在此大括号中定义的变量在外部是可访问的。

    代码示例

        在JavaScript中是有函数作用域的,在函数中定义的变量在函数外部是不可以访问的。有一种情况是不使用var关键字定义变量的将会变成全局属性(在外部可以访问)。

    代码示例

        用代码来理解作用域链。

    代码示例

        在函数outer()中定义了inner()函数,inner()函数中定义deep()函数,deep()函数中可以访问自己作用域中的变量,也可以访问“父级”作用域,又可以访问“父级的父级”作用域,这就形成了一条作用域链。

        接下来看下闭包,大部分内容还是来源于书上,不过也需要自己的理解。

    代码示例

        当执行 var inner = outer(); 时,outer函数返回内部函数inner,重新赋值给了一个全局变量inner。新的inner全局函数可以访问全局空间和outer函数空间,所以能访问到变量b。

    闭包图示

        我用了一段代码与图解来理解闭包,大部分源自书上。不过我觉得这真的难以用语言来形容,更好的还是代码,然后加上个人的理解。

        还有书上的一段话:“事实上,每个函数都可以被认为是一个闭包。因为每个函数都在其所在域(即该函数的作用域)中维护了某种私有联系。但在大多数时候,该作用域在函数体执行完之后就自行销毁了——除非发生一些有趣的事,导致作用域被保持。(有趣的事就是闭包)”

        所以,我觉得最核心的问题是要理解作用域。

    相关文章

      网友评论

          本文标题:作用域、作用域链和闭包

          本文链接:https://www.haomeiwen.com/subject/tljypltx.html