文章标题
来源:互联网 发布:怎么做图书marc数据 编辑:程序博客网 时间:2024/05/01 19:59
再来看这么一道题:
var add = function (m) { var temp = function (n) { return add(m + n); } temp.toString = function () { return m; } return temp;};add(1)(2); //3add(3)(4)(5); // 12
这个add函数可以无限次调用,能把所有传进去的值相加,最后返回相加总和。这道题用到的技术有:作用域、匿名函数、toString。
下面我来分析一下整个过程:
add(3)(4)(5);
1、先执行add(3),此时m=3,并且返回temp函数
function(n){
return add(3+n);
};2、执行temp(4),这个函数内执行add(3+n),即add(3+4),返回函数 add(7).
3、执行add(7),此时m=7,返回temp函数,即
function(n){
return add(7+n);
};4、执行temp(5),这个函数内执行add(7+n),返回函数add(12).
5、关键性一步来了,后面没有传入参数,等于返回的temp函数不被执行而是打印。我们知道对象的toString是修改对象转换字符串的方法,因此代码中temp函数的toString函数返回 m值,而m值在最后一步执行函数时,值m=12,所以返回值是12。
反思:可以把这个函数与柯里化的函数比较下:
function add(a){ return function(b){ return function(c){ return a+b+c; } }}add(3)(4)(5); //12
差别就是第一个函数在实现时循环调用了,是执行还是打印值取决于是否继续传入参数。注意toString()方法的使用。而柯里化传入参数的个数是一定的,规定好的。
0 0
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 学习
- GDI+ 使用指南(basic guiding of GDI plus )
- springmvc学习笔记(八)json传递数据
- 例说linux内核与应用数据通信(一):添加一个系统调用
- Android性能调优工具TraceView介绍
- 文章标题
- javascript-jquery插件--FlexGrid 用法参数
- QT跨线程的信号与槽[2]---后台SOCKET
- UVAoj 11178Morley's Theorem
- mysql 数据表的基本操作
- cdev_init和cdev_add之后在/dev目录下没有长出设备节点原因
- Android内存监测工具DDMS->Heap,内存分析工具->MAT
- XtraBackup 实现不停机不锁表搭建mysql主从
- 深入理解Java注解(2):高级应用