汤姆大叔的博客里看到了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的更多相关文章

  1. 实现如下语法的功能:var a = (5).plus(3).minus(6); //2

    从汤姆大叔的博客里看到了6个基础题目:本篇是第5题 - 实现如下语法的功能:var a = (5).plus(3).minus(6); //2 解题关键: 1.理解使用(5)和5的区别 2.构造函数原 ...

  2. 实现如下语法的功能:var a = add(2)(3)(4)

    function add(num){ var _add = function(args){ num+=args; return arguments.callee; } _add.toString = ...

  3. 实现如下语法的功能:var a = (5).plus(3).minus(6);

    Number.prototype.plus= function(val){ return parseInt(this)+val; }; Number.prototype.minus= function ...

  4. Qt中文本编辑器实现语法高亮功能(Qscitinlla)

    Scintilla是一个免费.跨平台.支持语法高亮的编辑控件.它完整支持源代码的编辑和调试,包括语法高亮.错误指示.代码完成(code completion)和调用提示(call tips).能包含标 ...

  5. IOS 表视图(UITableVIew)的使用方法(6)表视图的编辑功能(新增Add)

    表视图的新增功能和删除功能虽然目的不同,但是工作流程是相似的 下面列出在处理新增的回调函数时,与删除所不同的逻辑部分代码. 显示下过如下: #pragma mark #pragma mark Tabl ...

  6. vim nginx配置文件时具备语法高亮功能

    1.下载nginx.vim 下载页面:http://www.vim.org/scripts/script.php?script_id=1886 wget http://www.vim.org/scri ...

  7. Vim默认开启语法标识功能

    把syntax on加到$HOME/.vimrc文件中.

  8. Xcode解决代码高亮、语法提示、错误警告等功能失效的解决方法

    在编写xcode的项目的时候出现过代码不高亮的症状,而且所有的warning都不再提示,include的内容也显示symbol not found,非常奇怪,解决方案如下: 方法一: 1.把.pch里 ...

  9. 自己动手为Spark 2.x添加ALTER TABLE ADD COLUMNS语法支持

    SparkSQL从2.0开始已经不再支持ALTER TABLE table_name ADD COLUMNS (col_name data_type [COMMENT col_comment], .. ...

随机推荐

  1. Mybatis常用xml

    工作中mybatis常用的xml代码 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE ma ...

  2. (1)strchr

    const char * strchr ( const char * str, int character ); char * strchr ( char * str, int character ) ...

  3. 剑指Offer - 九度1391 - 顺时针打印矩阵

    剑指Offer - 九度1391 - 顺时针打印矩阵2013-11-24 04:55 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 ...

  4. python学习笔记二:流程控制

    一.if else: #!/usr/bin/python x = int(raw_input('please input:')) if x >= 90: if x >= 95: print ...

  5. Asp.Net中Response.Cookies.Remove 无法删除COOKIE的问题解决方法

    登陆功能经常需要使用Cookie来存储登陆信息,可是在开发过程中,经常发现cookie无法删除的问题.删除的代码无非就是找到Cookie并删除掉. 但是会发现 Response.Cookies.Rem ...

  6. TIDB介绍

    TiDB 是什么? TiDB 是一个分布式 NewSQL 数据库.它支持水平弹性扩展.ACID 事务.标准 SQL.MySQL 语法和 MySQL 协议,具有数据强一致的高可用特性,是一个不仅适合 O ...

  7. mac虚拟机上(centos系统)怎样实现共享本机文件

    首先加载vboxadditions,可以从https://download.virtualbox.org/virtualbox/下载,记得一定要跟virtualBox版本对应 然后打开virtualb ...

  8. Python网络编程(子进程的创建与处理、简单群聊工具)

    前言: 昨天我们已经了解了多进程的原理以及它的实际使用 Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次, 但是fork()调用一次,返回两次 ...

  9. heat launch an instance

    在包含Orchestration服务的环境中,可以创建启动实例的堆栈 创建yam文件 heat_template_version: 2015-10-15 description: Launch a b ...

  10. 【志银】nginx_php_mysql_phpMyAdmin配置(Windows)

    ✄更新中... 更新日期:2018.11.22 ★版本说明+快捷下载(官网)  nginx  nginx-1.14.1  http://nginx.org/download/nginx-1.14.1. ...