老师,问个今天遇到的面试题,我答错了。。

来源:6-3 什么是闭包?闭包会用在哪里?

灿烂__

2020-07-01

问: 三行a, b, c的输出分别是什么

function fun(n, o) {
  console.log(o)
  return {
    fun: function (m) {
      return fun(m, n);
    }
  };
}
var a = fun(0); a.fun(1); a.fun(2); a.fun(3); 
var b = fun(0).fun(1).fun(2).fun(3); 
var c = fun(0).fun(1); c.fun(2); c.fun(3);

我写的全是 undefined, 0, 1, 2,但是居然不对(哭泣.jpg),求老师解答

写回答

3回答

N1ghtV0yager

2021-10-29

其实也不复杂,你要关系每次执行的参数就行了,因为fun的输出结果只跟参数有关,所以:

var a : 0,undefined 1,0  2,0  3,0

var b:    0,undefined  1,0 2,1 3,2

var c:  0,undefined 1,0 2,1 3,1

result:

每次函数执行都是打印第二个参数所以结果就是每次执行的第二个参数

var a: undefined 0 0 0

var b: undefined 0 1 2

var c: undefined 0 1 1

个人感觉这题的现象是闭包造成的,但是不是在考闭包,更像是一种逻辑思维的考察

3
0

双越

2020-07-02

答错了,可能是有两种情况。第一,自己根本不会,懵了,没有任何方向。第二,没有什么语法的困难,自己能分析,只是问题比较繁琐,分析的时候搞错了。我猜测你可能属于第二种,因为这道题没有什么比较难的语法。

但这个问题确实很繁琐,你得一点一点慢慢的去分析,可能花的时间要久一些,而且要细心。我们拿问题的一部分,做一个分析演示,看看应该按照什么步骤来阅读代码。

// 1. 定义了一个 fun 函数
function fun(n, o) {
  // 3. 开始执行 fun(0)
  // 4. 这里 o 就是 undefined ,打印它
  // 10. 执行上一步的 fun(1, 0) ,第二个参数是 0 ,打印它
  console.log(o)
  // 5. 返回一个对象 { fun: 一个函数 }
  // 11. 返回一个对象 { fun: 一个函数 }
  return {
    fun: function (m) {
      // 8. 开始执行 a.fun(1) ,参数 m 即是 1
      // 9. 这里的 fun 就是代码一开始定义的 fun 函数,m 是 1,n 是 0 (闭包)
      return fun(m, n);
    }
  };
}

// 2. 执行 fun(0) ,返回结果赋值给 a
// 6. 上一步返回的 { fun: 一个函数 } 就赋值给了 a
var a = fun(0);

// 7. 执行 a.fun(1)
a.fun(1);

内容太多了,我先演示这一部分。

就得这么一点一点的来,慢慢的来,这种题目很耗费时间。

2
5
修船蛆宝宝
回复
双越
谢谢老师指点
2020-10-15
共5条回复

Best_Coder_LCN

2023-02-25

把函数名字换一下,会更清楚。

function outer(n, o) {
  console.log(`n: ${n}, o: ${o}`);
  return {
    inner: function (m) {
      // console.log(`m: ${m} n: ${n}`);
      return outer(m, n);
    },
  };
}

var b = outer(0).inner(1).inner(2).inner(3);


首先明白 outer 和 inner 返回的都是一个对象,对象里边儿有一个inner方法,所以才能链式调用。

为什么 inner() 返回的也是个对象呢? 

因为返回的outer 加了 '( )',所以会立即执行,所以最终返回的还是一个对象。


以最复杂的b来演示一下流程

首先执行 outer(0)

输出 n: 0, o: undefined 

因为闭包,所以 n 被保存了下来

再执行 .inner(1)

返回 outer(1,0),立即执行,输出 n: 1, o: 0

再执行 .inner(2)

返回 outer(2,1) , 输出 n: 2, o: 1

再执行 .inner(3)

返回  outer(3,2) 输出 n: 3, o: 2


所以b的最终结果是 undefined 0 1 2.


至于a和c的情况,知道链式调用之后,很轻松就明白执行结果了。

0
0

一天时间高效准备前端技术一面 匹配大厂面试要求

针对时下面试高频考点,帮助新人js面试快速通关

4694 学习 · 1681 问题

查看课程