面试遇见的闭包

作者: 程序员是粉色的 | 来源:发表于2018-04-08 18:01 被阅读214次

    其实在理解闭包前理解JavaScript的作用域是有必要的。

    下面讲一下我在面试中遇到的小问题

    图片1发自简书App

    当时我看到这个问题,不经过大脑思考直接输出的是My Object 然而正确的答案是The Window。

    后来我理解了,object.getNameFunc(),就相当于是 function(){ retuen this.name }()全局的匿名函数 全局的匿名函数this指向的是window 所以答案是The Window。

    图片2发自简书App

    图二和图一很相似,显然当时的我又做错了,正确的答案是My Object。

    后来我理解为:that是一个变量就相当于var a  局部变量getNameFunc内层函数存在局部变量that,that的值就是object对象  返回的函数与原函数形成闭包

    that就是那个受保护的变量  也就是object

    一般面试中都会提起以下小问题…

    1.什么是闭包?

    闭包就是指有权访问另一个函数作用域中变量的函数,通俗点讲闭包就是能够读取其他函数变量的函数。图3为闭包的小例子:

    图片3发自简书App

    2.为什么需要闭包?

    第一个用途就是上述通过闭包去访问函数内部变量。

    第二就是长久的保存变量又不会造成污染。

    以图4可以很完美体现这点:

    图片4发自简书App

    为什么会产生这样的情况?这是因为add2是fn的父亲函数,而在全局环境当中,fn其实是被赋给了全局变量result的,而result只会在全局环境执行完所有代码之后才会被回收,所以就导致了fn常驻内存,而fn的存在又依赖于父亲函数add2,所以add2在被调用之后也不会别GC回收,也始终存在于内存当中。

    3.如何使用闭包?

    ⅰ定义外层函数,封装被保护的局部变量。 ⅱ定义内层函数,执行对外部函数变量操作ⅳ外层函数返回内层函数的对象,并且外层函数被调用,结果保存在一个全局的变量中。

    4.闭包可能引发的问题?

    ①由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

    ②闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

    总结

    闭包通常会跟很多东西混搭起来,接触多了才能加深理解,这里只是开个头说说基础性的东西。

    相关文章

      网友评论

      本文标题:面试遇见的闭包

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