请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

问: 三行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

插入代码

3回答

N1ghtV0yager 2021-10-29 23:45:48

其实也不复杂,你要关系每次执行的参数就行了,因为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 回复 有任何疑惑可以回复我~
双越 2020-07-02 08:38:45

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 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 回复 有任何疑惑可以回复我~
  • 老师我想问下作用域链不是一层一层往上找么?为什么注释9是一开始定义的fun函数 而不是上一级的 fun函数呢?
    回复 有任何疑惑可以回复我~ 2020-10-15 07:26:50
  • 要在函数定义的地方,而不是函数执行的地方
    回复 有任何疑惑可以回复我~ 2020-10-15 08:45:14
  • return { } 的这个括号不算是一个作用域? 不是作用域的话 直接找全局的作用域fun函数,如果是作用域的话 还是说要用this.fun 才算是指向 return { }这个作用域?
    回复 有任何疑惑可以回复我~ 2020-10-15 09:15:44
Best_Coder_LCN 2023-02-25 15:47:35

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

1
2
3
4
5
6
7
8
9
10
11
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 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号