大部分人都会做错的经典JS闭包面试题

如题所述

经典JS闭包面试题的正确答案是:第一行为undefined,0,0,0;第二行为undefined,0,1,2;第三行为undefined,0,1,1。以下是详细的解析:

    理解闭包和函数作用域

      闭包是指函数能够记住并访问它的词法作用域,即使这个函数在它的词法作用域之外执行。在这个面试题中,有三个嵌套的fun函数,每个fun函数都有自己的作用域,但它们共享外部函数的变量。

    分析三个fun函数的关系

      第一个fun函数是在全局作用域中定义的,并返回一个新的对象,该对象包含一个匿名函数。第二个fun函数实际上是fun1内部定义的另一个函数,它访问并修改了fun1作用域内的变量。第三个fun函数是通过调用第一个fun函数返回的对象的属性再次获取的,因此它与第一个fun函数返回的匿名函数fun1是同一个函数。

    分析调用结果

      第一行调用:创建了一个新的对象,并调用其a属性对应的函数。由于这是第一次调用,n的初始值为0,且函数内部没有改变n的值,所以连续调用三次都返回0。由于b属性未定义,所以返回undefined。因此,结果是undefined,0,0,0。第二行调用:同样创建了一个新的对象,并调用其a属性对应的函数。这次调用时,n的初始值仍为0,但在函数内部,n被递增了三次,但由于闭包的作用,这些改变只影响当前这次调用的作用域内的n。因此,连续调用三次分别返回0, 1, 2。b属性仍然未定义,返回undefined。所以结果是undefined,0,1,2。第三行调用:这次调用的是之前通过第一行调用返回的对象中的a属性对应的函数。由于闭包的作用,这个函数实例记住了自己第一次被创建时的作用域,但在这个作用域中,n已经被递增到了1。然而,由于这次调用时,函数内部并没有再次改变n的值,所以连续调用两次都返回1。b属性仍然未定义,返回undefined。因此,结果是undefined,0,1,1。

总结:这个面试题主要考察了闭包、函数作用域以及变量提升等概念。理解这些概念是解答这个问题的关键。

温馨提示:答案为网友推荐,仅供参考
相似回答