人生的第一份前端工作找到了,感谢大神主子们给半路出家自学的我这么多的机会,很高兴正式踏上客观又乐趣满满的程序员之路,哇咔咔咔。

​ 分享一个准备面试时遇到的一个有趣的问题:

要求实现类似add(1)(2)(3)调用方式的方法,例如add为加法函数,则调用add(1)(2) 输出3,调用add(1)(5)(3)输出9。

​ 函数的调用方式是多次调用同一个函数,将每次传入的参数累加,多次函数运算过程中需要记录之前累加的值。很容易让我们联想到闭包,如果调用次数是固定的,我们可以这样来完成:

var add = function(a) {
return function(b) {
return function(c) {
return a + b + c;
};
};
}; add(1)(2)(3); //6

​ 可以看到运用闭包可以依次获取三次调用的参数,最终返回相加的结果。但如果要调用四次,这个函数就不适用了。如题目要求的不限次数调用,我们是不是可以让闭包函数返回自身来实现呢?如下:

var add = function(a) {
var sum = a ;
var addMore = function(b) {
sum += b;
return addMore; //addMore函数每次累加后返回自身,继续累加后面的执行参数。
};
return addMore; //获取第一个参数赋值给sum后,返回addMore函数。
}

​ 理论上这样就解决问题了,但在调试中我们会发现,当函数调用完毕后,输出的结果并不是sum,而是addMore函数,因为我们每次调用后都return函数自身。那现在需要解决的问题就是如何让函数输出sum值。

​ 在网上搜索答案后发现解决方法是:

首先要知道JavaScript中,打印和相加计算,会分别调用toString或valueOf函数,所以我们重写tmp的toString和valueOf方法,返回sum的值;

addMore.toString = function() {
return sum;
};

​ 如上解决方法是改写addMore闭包函数的toString方法,返回sum值。全部代码如下:

var add = function(a) {
var sum = a;
var addMore = function(b) {
sum += b;
return addMore;
}; addMore.toString = function() {
return sum;
}; return addMore;
}; add(1)(2)(3)(4); //function 10
var a = add(1)(2)(3)(4).toString(); //10

​ 如上代码的倒数第二行,函数最终返回的值会包含一个function前缀(暂时没有找到原因,是浏览器给出的提示么?请各位大神指导*0 *);结果再运用toString()函数就可以返回正确的数值。

函数还能这样玩儿~实现类似add(1)(2)(3)的函数的更多相关文章

  1. 实现类似add(1)(2)(3)的函数

    要求实现类似add(1)(2)(3)调用方式的方法,例如add为加法函数,则调用add(1)(2)输出3,调用add(1)(5)(3)输出9. ​ 函数的调用方式是多次调用同一个函数,将每次传入的参数 ...

  2. SQL还可以这么玩儿

    对于数据库的增删改查,我们都再熟悉不过了,今天,将和您一起探讨几种不一样的SQL用法,原来,SQL还可以这么玩儿. 以下是数据库的原表,如图-1. 1.快速复制表结构 这时,如果我们需要复制一份一模一 ...

  3. ajax实现注册用户名时动态显示用户名是否已经被注册(1、ajax可以实现我们常见的注册用户名动态判断)(2、jquery里面的ajax也是类似我们这样封装了的函数)

    ajax实现注册用户名时动态显示用户名是否已经被注册(1.ajax可以实现我们常见的注册用户名动态判断)(2.jquery里面的ajax也是类似我们这样封装了的函数) 一.总结 1.ajax可以实现我 ...

  4. 【C语言编程入门笔记】C语言果然博大精深!函数还分内部和外部?

    ۞ 外部函数与内部函数 前面我们讲解了关于函数的调用都是针对同一个源文件中其他函数进行调用的,而在有些情况下,函数也可以对另外一个源文件中的函数进行调用.当一个程序由多个源文件组成时,根据函数是否能被 ...

  5. netstat 竟然还能这么玩儿?

    一次摸鱼的机会,看到群里小伙伴问了一嘴 netstat -tnpl 这个命令是干啥的,这个命令用过很多,但是我其实也没有认真研究过,但是这是一个问题,我不能放过它,而且 netstat 这个命令我日常 ...

  6. Python3基础(3)集合、文件操作、字符转编码、函数、全局/局部变量、递归、函数式编程、高阶函数

    ---------------个人学习笔记--------------- ----------------本文作者吴疆-------------- ------点击此处链接至博客园原文------ 1 ...

  7. python12--字符串的比较 函数的默认值的细节 三元表达式 函数对象 名称空间 作用域 列表与字典的推导式 四则运算 函数的嵌套

     复习   1.字符串的比较; 2.函数的参数; ******实参与形参的分类: 3.函数的嵌套调用:     # 字符串的比较#  -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 ...

  8. 使用QFileInfo类获取文件信息(在NTFS文件系统上,出于性能考虑,文件的所有权和权限检查在默认情况下是被禁用的,通过qt_ntfs_permission_lookup开启和操作。absolutePath()必须查询文件系统。而path()函数,可以直接作用于文件名本身,所以,path() 函数的运行会更快)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Amnes1a/article/details/65444966QFileInfo类为我们提供了系统无 ...

  9. QT创建窗口程序、消息循环和WinMain函数(为主线程建立了一个QEventLoop,并执行exec函数)

    使用QT也有一段时间了,有的时候需要跟踪代码到QT的源码中去查找问题.在这里我将记录一下我跟踪QT源码学习到的一些知识. 我的开发环境是VC6.0+QT4.3.3.QT已经不为VC6.0提供addin ...

随机推荐

  1. Nido.Common.Utilities.MD5类

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Sec ...

  2. pdb文件部分解释

    pdb文件包含了编译后程序指向源代码的位置信息,用于调试的时候定位到源代码,主要是用来方便调试的. 在程序发布为release模式时,建议将 pdb文件删除, 同时,对外发布的时候,也把 pdb删除, ...

  3. JavaScript高级程序设计33.pdf

    操作样式表 CSSStyleSheet类型表示的是样式表包括通过<link>元素包含的样式表和在<style>元素中定义的样式表,前面提到过这两个元素本身分别是由HTMLLin ...

  4. Sicily1099-Packing Passengers-拓展欧几里德算法

    最终代码地址:https://github.com/laiy/Datastructure-Algorithm/blob/master/sicily/1099.c 做这题的时候查了别人的做法花了半天都没 ...

  5. java的单例设计模式

    java的单例设计模式包括:饿汉设计模式和懒汉设计模式: 步骤: 1.创建一个对象把他设置为私有的成员变量,保证唯一 2.私有构造方法,防止new一个对象. 3.定义一个公开的静态方法,返回第一步创建 ...

  6. typeof和instanceof 运算符

    instanceof运算符与typeof运算符相似,用于识别正在处理的对象的类型,但是在使用 typeof 运算符时采用引用类型存储值会出现一个问题. 无论引用的是什么类型的对象,它都返回 " ...

  7. Javascript substr方法在某些浏览器下行为出现BUG的补丁代码

    主要思路是使用兼容性和稳定性都保持一致的substring方法重写/覆盖substr /** * String.substr() bug fix * @param start * @param len ...

  8. JavaScript-每隔5分钟执行一次ajax请求的实现方法

    个页面好像只能有一个 window.onload=function(){},所以要有多个事件,这样写就好了 window.onload=function(){ //假设这里每个五分钟执行一次test函 ...

  9. HTML5另类塔防游戏 -《三国战线》公布

    关于本作 游戏介绍 本游戏是一款另类塔防游戏.本作以三国这段历史为题材,提供了从颍川之战到官渡之战.官渡之战到夷陵之战.夷陵之战到五丈原之战等15个关卡.在每一个关卡中,你会控制一名三国武将与出现的敌 ...

  10. Html学习笔记4

    <span style="font-size:18px;">超链接: 1 标签 语法: <a href="链接跳转后的地址 " >链接文 ...