谜题:JS 函数会返回自身,直到没有参数

2024-02-22

我正在尝试解决一个难题,但我却无计可施。

我应该创建一个像这样工作的函数:

add(1);       //returns 1
add(1)(1);    //returns 2
add(1)(1)(1); //returns 3

我知道这是可以做到的,因为其他人已经成功地完成了这个难题。我尝试了几种不同的方法来做到这一点。这是我最近的尝试:

function add(n) {
    //Return new add(n) on first call
    if (!(this instanceof add)) {
        return new add(n);   
    }

    //Define calc function
    var obj = this;
    obj.calc = function(n) {
        if (typeof n != "undefined") {
            obj.sum += n;
            return obj.calc;            
        }

        return obj.sum;
    }

    //Constructor initializes sum and returns calc(n)
    obj.sum = 0;
    return obj.calc(n);
}

这个想法是,在第一次通话时,一个新的add(n)被初始化并且calc(n)正在运行。如果calc接收一个参数,它添加n to sum并返回自身。当它最终没有收到参数时,它返回的值sum.

这在理论上是有道理的,但我无法让它发挥作用。有任何想法吗?

--edit--

我的代码只是我选择的路线。如果有人能想到一种不同的方法,我并不反对。


回答“这是如何工作的”。鉴于:

function add(n) {
    function calc(x) {
        return add(n + x);
    }
    calc.valueOf = function() {
        return n;   
    }
    return calc;
}

var sum = add(1)(2)(3); // 6

When add第一次被调用时,它将传入的值存储在一个名为的变量中n。然后返回该函数calc,它有一个闭包n和一个特别的valueOf方法(稍后解释)。

然后使用值 2 调用该函数,因此它调用add总和n + x,即1 + 2其中 3.

所以新版本calc返回,这次关闭n值为 3。

这个新的calc被调用的值为 3,所以它调用add with n + x,这次是3 + 3这是 6

Again add返回一个新的calc with n设置为 6。最后一次,calc不再被调用。返回值赋给变量sum。全部calc函数有特殊的valueOf替代标准方法提供的方法对象.原型 http://ecma-international.org/ecma-262/5.1/#sec-15.2.4.4。通常情况下valueOf只会返回函数对象,但在这种情况下它将返回值n.

Now sum可以用在表达式中,并且如果它valueOf方法被调用它将返回 6(即值n封闭举行)。

这看起来很酷,而且sum其行为很像一个原始数字,但它实际上是一个函数:

typeof sum == 'function';

因此,要小心严格测试事物的类型:

sum * 2   // 12
sum == 6  // true

sum === 6 // false -- oops!!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谜题:JS 函数会返回自身,直到没有参数 的相关文章

随机推荐