javascript - 拼图 : JS Function that returns itself until there are no arguments

标签 javascript

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

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

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 添加到 sum 并返回自身。当它最终没有收到参数时,它返回 sum 的值。

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

--编辑--

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

最佳答案

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

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

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

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

然后调用此函数并使用值 2,因此它调用 add 并使用 n + x 的总和,即 1 + 2 哪个 3.

因此返回了一个新版本的 calc,这次带有一个值为 3 的 n 的闭包。

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

add 再次返回一个新的 calcn 设置为 6。这最后一次,calc 不是我又打来了。返回值分配给变量sum。所有的calc 函数都有一个特殊的valueOf 方法来替代Object.prototype 提供的标准方法。 .通常 valueOf 只会返回函数对象,但在这种情况下它将返回 n 的值。

现在 sum 可以用在表达式中,如果它的 valueOf 方法被调用,它将返回 6(即 n 的值在闭包中)。

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

typeof sum == 'function';

所以要小心严格地测试事物的类型:

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

sum === 6 // false -- oops!!

关于javascript - 拼图 : JS Function that returns itself until there are no arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25578728/

相关文章:

javascript - 递归调用导致调用堆栈溢出但事件队列不会溢出?

javascript - 如何在Javascript中为不同的页面访问存储变量

javascript - VueJS : How to dynamically execute Javascript from string?

javascript - 检查 jquery tmpl 中 if 语句中对象中的 null 值

javascript - 使用 d3.js 选择包含的 DOM 树中的一个元素

javascript - 在 Google map 上使用本地 MySQL 数据库和 PHP 和 JavaScript

javascript - 如何识别正在使用哪个元素滚动?

javascript - 如果调整了一张卡片的大小,请连续调整所有卡片的大小

javascript - 图像合成后添加文本,html5 canvas

javascript - 替换图像文本 jQuery