JS闭包面试难题解析:层层递进的函数调用

2 下载量 26 浏览量 更新于2024-08-30 收藏 114KB PDF 举报
"这篇文章除了提出一个与JavaScript闭包相关的面试题之外,还讨论了函数的分类,包括具名函数和匿名函数,并提供了一个兼容性方法来获取函数的名称。文章通过一道实际的代码题,展示了闭包在函数嵌套调用中的作用和陷阱。" 在这篇关于“一不小心就做错的JS闭包面试题”的文章中,作者提出了一道有趣的编程题目,旨在考察面试者对于JavaScript闭包的理解。题目涉及的代码是一个三层嵌套的fun函数,每个fun函数内部都返回一个新的fun函数,参数在每次调用中传递。通过var a, b, c 的不同调用方式,题目询问了最终的输出结果。 在解答这个问题之前,文章首先介绍了JavaScript中的两种函数类型:具名函数和匿名函数。具名函数是具有名称的函数,可以通过fn.name来访问其名称,而匿名函数则没有name属性。由于在某些旧版IE浏览器中无法正确获取具名函数的name,文章提供了一个兼容性的函数`getFunctionName`,用于获取任何函数的名称,即使在不支持fn.name的环境中。 回到闭包面试题,代码中的关键在于理解每个fun函数如何保留对其自身以及外部环境的引用。变量o的值在每次调用中都是由外层函数传递的,而n则是通过闭包保持状态。当执行`a.fun(1); a.fun(2); a.fun(3)`时,a始终引用最初的fun函数实例,因此o始终保持为0。所以a的输出为`undefined, 0, 0, 0`。而对于`b = fun(0).fun(1).fun(2).fun(3)`,每次fun的调用都是前一次调用的结果,因此o依次为0, 1, 2, 3,输出为`undefined, 0, 1, 2`。最后,`c = fun(0).fun(1)`,此时c引用的是第二次调用的fun函数,其内部的n值为1,所以后续的`c.fun(2); c.fun(3)`的o值保持为1,输出为`undefined, 0, 1, 1`。 解答这个闭包面试题,需要深入理解JavaScript的作用域链、函数的执行上下文以及闭包如何保存对外部变量的引用。通过这类问题,开发者不仅可以检验自己的理论知识,还能提升对实际编程中闭包运用的敏感度和技巧。