小题解析

Posted 岁月如歌(丁盛)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小题解析相关的知识,希望对你有一定的参考价值。

前两天一位朋友留言问了我关于js的小题,其实在这位朋友之前曾经也有人询问过此类题,思前想后觉得写出来给那些还正在解答此题中的朋友们。

 

原型

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是此次传进来的数值4,m值还是上一步中的3,所以add(m+n)=add(3+4)=add(7),此时m=7,并且返回temp函数

3、执行temp(5),这个函数内执行add(m+n),n是此次传进来的数值5,m值还是上一步中的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

 

延伸

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); //undefined,0,0,0

var b = fun(0).fun(1).fun(2).fun(3); //undefined,0,1,2

var c = fun(0).fun(1);  c.fun(2);  c.fun(3); //undefined,0,1,1

 

函数fun,需要两个参数n和o,先是打印出参数o,然后return 一个对象,该对象包含一方法fun,方法fun调用函数fun并返回它的值。

解释一下相关过程:

  • var a = fun(0);  a.fun(1);  a.fun(2);  a.fun(3)

  • 先执行fun(0),n=0,o=undefined,console.log 打印出 undefined;

  • 再执行a.fun(1),n=0,m=1,console.log打印出 0;

  • 再执行a.fun(2), n=0,m=2,console.log打印出0;

  • 再执行a.fun(3), n=0,m=3,console.log打印出0;

  • var b = fun(0).fun(1).fun(2).fun(3);

  • 先执行fun(0),n=0,o=undefined,console.log 打印出 undefined;

  • 再执行fun(1),n=0,m=1,console.log打印出 0;

  • 再执行fun(2), n=1,m=2,console.log打印出1;

  • 再执行fun(3), n=2,m=3,console.log打印出2;

  • var c = fun(0).fun(1);  c.fun(2);  c.fun(3);

  • 先执行fun(0),n=0,o=undefined,console.log 打印出 undefined;

  • 再执行fun(1),n=0,m=1,console.log打印出 0;

  • 再执行c.fun(2), n=1,m=2,console.log打印出1;

  • 再执行c.fun(3), n=1,m=3,console.log打印出1;

 

转自: 原创

作者:  前端javascript

 

以上是关于小题解析的主要内容,如果未能解决你的问题,请参考以下文章

递归小题

概率论与数理统计猴博士 笔记 p41-44 统计量相关小题三大分布的判定性质总体服从正态分布的统计量小题

为了让脑袋不生锈,做个小题

关于理解python类的小题

mysql小题趣事

DFS小题