像这样更改参数[function.value(new value)]

Change the parameter like this [function.value(new-value)]

本文关键字:value new function 参数 像这样      更新时间:2023-09-26
function add(n) {   
    return function(x) {
        this.value = n;
        return this.value + x;
    }
}
var add3 = add(3);
var add4 = add(4);

我想知道是否可以重写上面的函数:允许修改第一个参数如下:

add3.value(1);
console.log(add3(4))
// 5

此外,如果没有传递参数,则value方法返回当前值:

add3.value(1);
console.log(add3.value())
// 1

函数只是对象,因此可以为其分配属性value,其值是修改n:的函数

function add(n) { 
    var result = function(x) {
       return n + x;
    };
    result.value = function(x) {
       if (typeof x === 'undefined') {
         return n;
       }
       n = x;
    };
    return result;
}

我不知道你为什么要这么做,但这是可能的。

要使用您所描述的接口,您的内部函数需要返回一个带有"value"方法的对象。例如

function add (n) {
    return {
        value: function (x) {
            x = x || 0;
            return n + x;
        }
    };
}

但是,听起来你想做的是咖喱&部分应用。在这种情况下,返回函数可能更简单。

function add (n) {
    return function (x) {
        x = x || 0;
        return n + x;
    };
}

这样使用:

var add3 = add(3);
console.log(add3(4)); // output: 7

或者,默认值为:

var add4 = add(4);
console.log(add4()); // output: 4

类似于Felix的答案,但允许空输入,记住最后的值,并给它一个valueOf,这样它就可以像数字一样使用了。

function adder(i) {
    i || (i = 0);
    var add = function (x) {
        return i += (+x || 0); // += modifies i
    };
    add.value = function (x) {
        return !x && x !== 0 ? i : i = (+x || 0); // if x falsy but not zero
    };
    add.valueOf = function () {
        return i;
    };
    return add;
}
var add = adder();
add.value(1); //  1
add(4);       //  5
add(5);       // 10
add + 2;      // 12, via valueOf
add();        // 10