返回大旺国际登录网站

一道经典的JavaScript面试题

时间:2014-02-24 22:57来源:大旺国际登录网站www.zhixing123.cn 编辑:麦田守望者

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

题的原型:

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的重写只是为了函数不实行时能够返回最后运算的结果值,所以这个地方是可以任意修改的,你让它返回什么它就返回什么,比如改写:

temp.toString = function () {
    return "total : " + m;
}

实行结果:

>>> add(3)(4)(5);
total : 12

 

------分隔线----------------------------
标签(Tag):Javascript javascript实例教程 JavaScript源代码 JavaScript基础教程
------分隔线----------------------------
推荐内容
猜你感兴趣
XML 地图 | Sitemap 地图