实现类似add(1)(2)(3)的函数
要求实现类似
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)的函数的更多相关文章
- 函数还能这样玩儿~实现类似add(1)(2)(3)的函数
人生的第一份前端工作找到了,感谢大神主子们给半路出家自学的我这么多的机会,很高兴正式踏上客观又乐趣满满的程序员之路,哇咔咔咔. 分享一个准备面试时遇到的一个有趣的问题: 要求实现类似add(1)( ...
- ajax实现注册用户名时动态显示用户名是否已经被注册(1、ajax可以实现我们常见的注册用户名动态判断)(2、jquery里面的ajax也是类似我们这样封装了的函数)
ajax实现注册用户名时动态显示用户名是否已经被注册(1.ajax可以实现我们常见的注册用户名动态判断)(2.jquery里面的ajax也是类似我们这样封装了的函数) 一.总结 1.ajax可以实现我 ...
- 修改和获取web.config或app.config文件appSettings配置节中的Add里的value属性 函数
1: /// <summary> 2: /// 修改web.config或app.config文件appSettings配置节中的Add里的value属性 3: /// </summ ...
- 实现类似add(1)(2)(3)结果为6的效果
前两天看到一个问题说怎样实现add方法实现add(1)(2)(3)结果为6,于是开始引发了我的思考. 1.想要实现add()()这样调用方式,add()方法的返回值务必是一个函数 function a ...
- sql server中类似oracle中decode功能的函数
sqlserver 2008 写法 select t.PROJECTNAME, t.BUILDCONTENTSCALE, CASE t.PROJECTLEVEL ' THEN '国家重点' ' THE ...
- 实现js的类似alert效果的函数
这个简单的类似alert的函数,效果还行,至于css样式,那没的说了,笔者确实尽力了,如果读者觉得太烂,你可以随便改函数的样式的,反正,笔者觉得还可以,呵呵. <!DOCTYPE html PU ...
- JavaScript学习笔记(二)——闭包、IIFE、apply、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- JavaScript学习总结(二)——闭包、IIFE、apply、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...
- JavaScript 函数表达式
JavaScript中创建函数主要有两种方法:函数声明和函数表达式.这两种方式都有不同的适用场景.这篇笔记主要关注的是函数表达式的几大特点以及它的使用场景,下面一一描述. 主要特点 可选的函数名称 函 ...
随机推荐
- 347. Top K Frequent Elements (sort map)
Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...
- Tessellation
Tessellation细分曲面技术是AMD(ATI)常年研发多代的技术,经过多年发展最终被采纳成为DX11的一项关键技术,因此历来都是宣传重点.和光线追踪不同,现在的光栅化图形渲染技术的核心是绘制大 ...
- 移动平台unity3d优化
目录(?)[-] Focus on GPUs 着眼于GPU Good practice 优秀的实践 Sharer optimizations 着色器优化 Focus on CPUs 着眼于CPUs G ...
- Android的文件读取与存储
Java新建文件,然后就可以写入数据了,但是Android却不一样,因为Android是 基于Linux的,我们在读写文件的时候,还需加上文件的操作模式 Environment类是一个提供访问环境变量 ...
- Maven聚合工程怎么变回普通的Maven工程
问题 Maven聚合工程的父工程的packaging是pom,如果我们将其改为jar,会立刻报错: Project build error: 'packaging' with value 'jar' ...
- VLAN-5-802.1Q-in-Q隧道
Q-in-Q允许SP在跨越WAN服务时,保留802.1Q VLAN标签.由此,VLAN可以被拓展到多个地理分散的站点上. 入向SP交换机收到802.1Q数据帧,使用额外的802.1Q头部来标记 ...
- gns3 拖出设备显示一个红色的s,无法启动虚拟设备
通过view-docks-调出console窗口,显示错误信息: Error while creating project: Can't connect to server http://172.0. ...
- base64模块
********base64模块******** Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打开exe.jpg.pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很 ...
- Codeforces Round #390 (Div. 2) B
Ilya is an experienced player in tic-tac-toe on the 4 × 4 field. He always starts and plays with Xs. ...
- Java微信公众平台开发(八)--多媒体消息回复之音乐
我们上一篇写了关注出发图片的回复.想着在发送一次音乐,最后基于回复消息分类情况下,实现一个简单的只能话回复.先附一张大致效果图. 下面我们进入代码阶段. (一)修改消息转发器MsgDispatcher ...