一道经典的JavaScript面试题
一道经典的JavaScript面试题
大头儿子程序猿 发表于10个月前
一道经典的JavaScript面试题
  • 发表于 10个月前
  • 阅读 2
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

前两天一位朋友发邮件问了我关于这道经典的面试题,其实在这位朋友给我发邮件之前曾经也有人给我发过邮件询问过此类笔试题,思前想后觉得写出来给那些还正在解答此题中的朋友们。

题的原型:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

var add = function (m) {

 

    var temp = function (n) {

        return add(m + n);

    }

 

    temp.toString = function () {

        return m;

    }

 

    return temp;

};

 

 

add(3)(4)(5); // 12

add(3)(6)(9)(25); // 43

 

这个add函数可以无限次调用循环调用,并且把所有传进去的值相加,最后返回相加总数。这道题咋一看有点特别,但代码量极其少而精,重点技术在于:作用域、交替、匿名函数、toString的巧妙

让我们来解释这个过程:add(3)(4)(5)

1、先执行add(3),此时m=3,并且返回temp函数;

2、执行temp(4),这个函数内执行add(m+n)n是此次传进来的数值4m值还是上一步中的3,所以add(m+n)=add(3+4)=add(7),此时m=7,并且返回temp函数

3、执行temp(5),这个函数内执行add(m+n)n是此次传进来的数值5m值还是上一步中的7,所以add(m+n)=add(7+5)=add(12),此时m=12,并且返回temp函数

4、关键性一步来了,后面没有传入参数,等于返回的temp函数不被执行而是打印,了解JS的朋友都知道对象的toString是修改对象转换字符串的方法,因此代码中temp函数的toString函数return m值,而m值是最后一步执行函数时的值m=12,所以返回值是12

看到这其实就很明白了,代码中temp.toString的重写只是为了函数不执行时能够返回最后运算的结果值,所以这个地方是可以任意修改的,你让它返回什么它就返回什么,比如改写:

1

2

3

temp.toString = function () {

    return "total : " + m;

}

执行结果:

1

2

>>> add(3)(4)(5);

total : 12

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 20
码字总数 3454
×
大头儿子程序猿
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: