小题解析

前两天一位朋友留言问了我关于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

时间: 2024-09-30 09:30:34

小题解析的相关文章

乾颐堂安德华为数通HCNA真题解析版(第2部分)

HCNA真题解析视频即将上线,敬请关注本博客以及乾颐堂官网书接上文:16 Interface GigabitEthernet0/0/1 Port link‐type trunk Port trunk allow‐pass vlan 2 to 4094 根据如上所示的命令输出,下列描述中正确的是()(多选)A GigabitEthernet0/0/1 不允许 VLAN1 通过B GigabitEthernet0/0/1 允许 VLAN1 通过C 如果要把 GigabitEthernet0/0/1

关于js中全局变量和局部变量的寄到小题

往往最基本的也是最根本的. 这里有三道关于全局变量和局部变量的小题,供诸位一阅. 知识点: (1)在最外层声明的是全局变量 (2)在函数内声明的是局部变量 (3)在函数体内部,但是没有用var声明的变量也是全局变量 第一题: var a = 10;function fun(){var a = "global";}console.log(a); 第二题: var a ;function fun(){a = "global";} fun();console.log(a)

关于SQL的几道小题详解

关于SQL的几道小题详解 当我们拿到题目的时候,并不是急于作答,那样会得不偿失的,而是分析思路,采用什么方法,达到什么目的,还要思考有没有简单的方法或者通用的方法等等,这样才会达到以一当十的效果,这样的惯性思维其实早在我们度高中的时候就被领教了,所谓“万变不离其宗”吧.以下各题来自日常所见,或QQ群,或面试题,或博客园. 题目一:如下表所示,现需要按照收款员统计收款和退款合计金额. 实现结果需如下显示: 分析:想要的结果(记为表B)和源数据(记为表A)相比,有共同的列(收款员),不同的是表A的金

关于理解python类的小题

今天看了python部落翻译的一篇<一道python类的小题>文章,感觉挺有启发性,记录下来: 1 print('A') 2 class Person(object): 3 print('B') 4 def __int__(self,name): 5 print('C') 6 self.name = name 7 print('D') 8 print('E') 9 10 11 p1= Person('name1') 12 p2 = Person('name2') 输出结果: A B D E C

几个小题

1.从一个数值连续的数组中,抽调n个元素,查找抽调的是哪几个 #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int a[100] = {0}; //抽掉3, 4, 57 int b[100] = {0}; //原始数组, [0, 99] for (int i = 0; i < sizeof(a) / sizeof(a

php小经验:解析preg_match与preg_match_all 函数

php小经验:解析preg_match与preg_match_all 函数 本篇文章是对php中的preg_match函数与preg_match_all函数进行了详细的分析介绍,需要的朋友参考下 正则表达式在 PHP 中的应用在 PHP 应用中,正则表达式主要用于:•正则匹配:根据正则表达式匹配相应的内容•正则替换:根据正则表达式匹配内容并替换•正则分割:根据正则表达式分割字符串在 PHP 中有两类正则表达式函数,一类是 Perl 兼容正则表达式函数,一类是 POSIX 扩展正则表达式函数.二者

递归小题中的空间换时间思想

题目: 如数: 1  1  2  3   5   8   13   21  34  55 ...... 序号: 0  1  2  3   4   5   6     7    8    9 ...... 由用户输入序号,输出对应的数值. 效果: 实现代码: #include <stdio.h> int bian(int num); //static int shu[100]={1,1}; int main() { int num; while ( printf("请输入编号数:&qu

逛园子,看到个练习题,小试了一把(淘宝ued的两道小题)

闲来无事,逛园子,充充电.发现了一个挺有意思的博文,自己玩了一把. 第一题:使用 HTML+CSS 实现如图布局,border-widht 1px,一个格子大小是 60*60,hover时候边框变为橘红色(兼容IE6+,考虑语义化的结构) 效果图: 简单分析一下: 使用伪类 :hover的时候相对定位 改变z-index, 代码如下: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta c

Linux 的面试小题 9

一.选择题(24分,每小题3分) 1. 操作系统是一组什么( C ) A.文件管理程序  B.中断处理程序 C.资源管理程序  D.设备管理程序   解释:在一个计算机操作系统中,通常含有多种硬件和软件资源.归纳起来可将这些资源分为四类:处理机.存储器.I/O设备以及文件(数据和程序).相应的,OS的主要功能也正是对这四类资源进行有效的管理.处理机管理是用于分配和控制处理机:存储器管理主要负责内存的分配与回收:I/O设备管理是负责I/O设备的分配(回收)与操纵:文件管理是用于实现对文件的存取.共