实现如下语法的功能:var a = add(2)(3)(4); //9
从汤姆大叔的博客里看到了6个基础题目:本篇是第6题 - 实现如下语法的功能:var a = add(2)(3)(4); //9
解题关键:add()函数需要返回一个加法函数,而不是一个普通的值,即定义add(),并想办法让add()返回一个add()。js最显著的特征就是函数的返回值可以是一个函数。
实现办法:
第1步:在add()体内定义一个fn,该fn返回一个add()。add传递第1个加数,fn传递第2个加数,返回add时,将两个加数之和传递给add,这样就实现了累加。
第2步:定义add()的返回值为fn
如此一来,就变成了add返回fn,而fn又返回了add,这就是变相的add返回add!如下是代码:
function add(a) {
var fn = function(b) {
return add( a+b ); //fn返回的是add函数,并将a与b相加的值传递给add,实现累加
}
return fn;
}
var t = add(1)(2);
console.log( t );
运行查看,并没有输出我们预期的结果3,而是输出了 fn 这个函数的定义代码。为什么会这样?不用想太多,本身就是这样。因为add返回的是一个函数,并非一个具体的值,所以输出add时,自然就得到了这段定义的代码。那么如何才能得到我们要的那个值呢?
回看fn函数的定义,它返回的是一个add函数,并将a+b的值作为add的参数,那么时此的add的参数,不正就是累加的总和吗?(请仔细思考)换句话说,就是add中的a,总是保存着累加的和。那我们要如何得到这个值呢?
js中console.log一个对象时,会对这个对象进行toString()操作,还有些情况会对对象进行valueOf()操作,那么我们只要让fn的toString()和valueOf()返回的是a的值就可以解决问题,代码如下:
function add(a) {
var fn = function(b) {
return add( a+b ); //fn返回的是add函数,并将a与b相加的值传递给add
}
fn.toString = fn.valueOf = function() {
return a; // 1为什么返回a? // 2为什么定义fn.toString而不是add.toString?
}
return fn;
}
var t = add(1)(2);
console.log( t );
以上代码中的问题1和问题2请仔细思考,此处不详解!
本题解答完毕!
实现如下语法的功能:var a = add(2)(3)(4); //9的更多相关文章
- 实现如下语法的功能:var a = (5).plus(3).minus(6); //2
从汤姆大叔的博客里看到了6个基础题目:本篇是第5题 - 实现如下语法的功能:var a = (5).plus(3).minus(6); //2 解题关键: 1.理解使用(5)和5的区别 2.构造函数原 ...
- 实现如下语法的功能:var a = add(2)(3)(4)
function add(num){ var _add = function(args){ num+=args; return arguments.callee; } _add.toString = ...
- 实现如下语法的功能:var a = (5).plus(3).minus(6);
Number.prototype.plus= function(val){ return parseInt(this)+val; }; Number.prototype.minus= function ...
- Qt中文本编辑器实现语法高亮功能(Qscitinlla)
Scintilla是一个免费.跨平台.支持语法高亮的编辑控件.它完整支持源代码的编辑和调试,包括语法高亮.错误指示.代码完成(code completion)和调用提示(call tips).能包含标 ...
- IOS 表视图(UITableVIew)的使用方法(6)表视图的编辑功能(新增Add)
表视图的新增功能和删除功能虽然目的不同,但是工作流程是相似的 下面列出在处理新增的回调函数时,与删除所不同的逻辑部分代码. 显示下过如下: #pragma mark #pragma mark Tabl ...
- vim nginx配置文件时具备语法高亮功能
1.下载nginx.vim 下载页面:http://www.vim.org/scripts/script.php?script_id=1886 wget http://www.vim.org/scri ...
- Vim默认开启语法标识功能
把syntax on加到$HOME/.vimrc文件中.
- Xcode解决代码高亮、语法提示、错误警告等功能失效的解决方法
在编写xcode的项目的时候出现过代码不高亮的症状,而且所有的warning都不再提示,include的内容也显示symbol not found,非常奇怪,解决方案如下: 方法一: 1.把.pch里 ...
- 自己动手为Spark 2.x添加ALTER TABLE ADD COLUMNS语法支持
SparkSQL从2.0开始已经不再支持ALTER TABLE table_name ADD COLUMNS (col_name data_type [COMMENT col_comment], .. ...
随机推荐
- 剑指Offer - 九度1386 - 旋转数组的最小数字
剑指Offer - 九度1386 - 旋转数组的最小数字2013-11-24 01:57 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转 ...
- Synology DS213J 群晖NAS git server架设方法!
最近单位购入一台Synology DS213J用作数据存储. 本人打算将一些项目的源代码也放在上面,他本身的套件中心提供了SVN SERVER和GIT SERVER. 设置SVN SERVER非常简 ...
- echarts 柱状图下钻功能
var drillDown = { getOption : function () { var option = null; option = { title: { text: ' ...
- OpenCV_1.0安装包下载
OpenCV_1.0安装包下载 点击下载
- kafak基本操作
创建topic bin/kafka-topics.sh --create --zookeeper 192.168.1.81:2181 --replication-factor 3 -partition ...
- iptables的配置文件/etc/sysconfig/iptables不存在 linux防火墙开关命令
某linux服务器,使用 cat /etc/sysconfig/iptables命令时, 找不到文件. 1. service iptables status 使用该命令检查状态 如果之前找不到配置文件 ...
- Application_Start事件中用Timer做一个循环任务
protected void Application_Start(object sender, EventArgs e) { System.Timers.Timer timer = new Syste ...
- 更优雅的清除浮动float方法
上篇文章是利用 :after 方法清除浮动float(作用于浮动元素的父元素上). ; } //为了兼容性,因为ie6/7不能使用伪类,所以加上此行代码. .outer:after {;;visibi ...
- nagios服务端安装
系统环境:操作系统:CentOS-5.7 x86_64Apache版本: Apache-2.2.22Nagios版本: nagios-3.3.1GD库: gd-2.0.33 2.安装前准备:2.1.安 ...
- ls目录结构
命令ls ls -l = ll -l 详细信息-a 查看隐藏的文件或目录-d 只看目录本身,不列出目录下面的文件和目录 一起使用一般 ls -ld-t 以时间先后排序-i 显示文件节点-h 显示字节大 ...