深度解析:一不小心就做错的JavaScript闭包面试题

5星 · 超过95%的资源 1 下载量 145 浏览量 更新于2024-08-30 收藏 80KB PDF 举报
"本文主要探讨了JavaScript中的一个经典面试题,涉及到闭包的概念以及函数的性质,通过三个示例代码解析了闭包在函数调用中的行为。文章中还提到了JS中的两种函数类型——具名函数和匿名函数,并提供了获取函数名称的兼容方法。" 在JavaScript中,闭包是一种强大的特性,它允许内部函数访问并操作其外部函数的变量,即使外部函数已经执行完毕。上述面试题中,`fun`函数内部创建了一个新的`fun`函数作为返回值,这就形成了闭包。每个`fun`函数都有自己的作用域链,能够记住并访问其定义时的作用域,即使这个作用域在函数调用结束后仍然存在。 题目中给出了三个变量`a`, `b`, `c`,它们分别调用了`fun`函数及其内部的`fun`函数,每次调用都会改变`n`的值。理解这个问题的关键在于跟踪每个闭包中`n`的值,以及函数调用的顺序。 对于变量`a`,初始调用`fun(0)`创建了一个闭包,其中`n`等于0。然后,连续调用`a.fun(1)`, `a.fun(2)`, `a.fun(3)`都是在同一个闭包内进行,因此`n`始终保持为0,输出依次是`undefined`, `0`, `0`, `0`。 对于变量`b`,连续调用`fun(0).fun(1).fun(2).fun(3)`在每次调用时都会更新`n`的值,所以输出分别是`undefined`, `0`, `1`, `2`。 对于变量`c`,首次调用`fun(0).fun(1)`创建了一个闭包,`n`被设置为1。然后后续的`c.fun(2)`和`c.fun(3)`都在这个闭包内,所以`n`保持为1,输出是`undefined`, `0`, `1`, `1`。 接着,文章提到了JavaScript中的两种函数类型。具名函数是具有名称的函数,可以像其他变量一样引用,而匿名函数没有名称,通常作为参数传递或在表达式中使用。通过`fn.name`可以检查一个函数是否为具名函数,但需要注意的是,这个属性在低版本的IE中可能返回`undefined`。为了兼容性,可以使用提供的`getFunctionName`函数来获取函数的名称。 这个面试题考察了开发者对JavaScript闭包、作用域、函数类型及函数属性的理解,解答这些问题有助于深入掌握JavaScript的核心机制。对于开发者来说,熟悉并熟练运用这些概念是至关重要的,因为它们在实际开发中扮演着关键角色,特别是在处理异步操作、模块化和数据封装等方面。