文章标题

来源:互联网 发布:怎么做图书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
原创粉丝点击