将函数作为参数传递给curried函数时,有没有办法提取这个参数?

时间:2016-05-31 05:49:25

标签: javascript

我刚刚学习了JavaScript中的函数currying。

我做方法调用,例如:

yoHello('m', 'j') //prints m followed by j in the console

yoHello('m', 'j')('k') // prints TypeError: yoHello(...) is not a function

JS代码:

function yoHello() {
  for (var i = 0; i<arguments.length; i++) {
    if (typeof arguments[i] == "string") {
      console.log(arguments[i]);
    }
    else { //assume function
      console.log([].slice.call(arguments[i],0)); //TypeError: yoHello(...) is not a function
    }
  }
}

如何更改 yoHello 以便提取&#39; k&#39;如上所述传递的论点?另外,我应该怎样查看&#39; k&#39;当它如上所述传递时 - 它是匿名函数的参数吗?或者它应该被视为 yoHello 的另一个实例的参数?

1 个答案:

答案 0 :(得分:0)

通过从函数返回函数来进行Currying。例如;

function add(x){
    return function(y){
        return x + y;
    }
}

您可以使用以下内容;

add(1)(2) // = 3

你为什么要用这个?因此,您可以将x设置为重复使用,然后输入y;

的不同值
add1 = add(1);
add1(2) // = 3
add1(9) // = 10

如果你想打印输入的变量,你可以这样做;

function yoHello(){
    var args1 = arguments;
    return function(){
        args2 = arguments;
        for (var i = 0; i<args1.length; i++) {
            console.log(args1[i]);
        }
        for (var i = 0; i<args2.length; i++) {
            console.log(args2[i]);
        }
    }
}

yoHello('m', 'j')('k') // logs:  m \n j \n k
yo = yoHello('m','j')
yo('k') // logs:  m \n j \n k

或者交替;

function yoHello(){
    var args1 = arguments;
    for (var i = 0; i<args1.length; i++) {
        console.log(args1[i]);
    }
    return function(){
        args2 = arguments;
        for (var i = 0; i<args2.length; i++) {
            console.log(args2[i]);
        }
    }
}

yoHello('m', 'j')('k') // logs:  m \n j \n k
yo = yoHello('m','j') // logs: m \n j
yo('k') // logs: k