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

时间:2014-04-14 00:35:25

标签: javascript function

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

3 个答案:

答案 0 :(得分: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;
}

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

答案 1 :(得分:0)

要使用您所描述的界面,您的内部功能需要返回一个具有'值的对象'方法。 例如

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

答案 2 :(得分:0)

Felix's answer类似,但允许空输入,记住最后一个值并给它一个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