Javascript:作为参数,可能性

时间:2016-10-26 15:42:38

标签: javascript function

我想知道是否可以在Javascript中执行类似的操作:

one(plus(nine())); // returns 10

似乎如此,但我不确定如何将one()的值传递给plus()函数。

4 个答案:

答案 0 :(得分:13)

一个这样的选择是定义(使用arrow functions简洁 1 ):

// creates a function that either returns the number, or forwards the number
// as an argument to the provided function
//   createNumber(10)() == 10
//   createNumber(9)(Math.sqrt) == 3
var createNumber = value => f => f ? f(value) : value;

var one = createNumber(1);
var nine = createNumber(9);

// A very basic curryed implementation of addition
//   plus(1)(2) == 3
var plus = a => b => a + b;

这提供了您所需的行为

> one(plus(nine())
10

还有一大堆同样被误导但正确的行为

> nine()
9
> nine(plus(one()))
10
> plus(nine())(one())
10
> nine(plus)(one())
10

1 :有关标准匿名函数的翻译,请参阅Vincenzo Maggio's answer

答案 1 :(得分:2)

是的,Javascript是原型/功能语言可以创建新功能并传递它们

//Returns a function that called without parameters extract the internal number
function number(num = null) {
  return function(op) {
    if (op == null) return num
      else return op(num)
  }
}

function plus(n1) {
  return function(n2) {
    return n2 + n1
  }
}

var one = number(1)
var nine = number(9)

document.write(one(plus(nine())))

如果您需要,我已保存this fiddle供您使用。

答案 2 :(得分:0)

绝对有可能。

但是,你需要使用一些可能不太干净的扭曲逻辑,你会非常难以让它真正有用。

解决此特定问题的一种可行的实际解决方案:

nine = function(c) {

  if (typeof c === "object" && typeof c.method !== "undefined") {
    return c.value + 9;
  } else {
    return 9;
  }

};

plus = function(a) {
  return {
    value: a,
    method: "+"
  }
};

one = function(c) {

  if (typeof c === "object" && typeof c.method !== "undefined") {
    return c.value + 1;
  } else {
    return 1;
  }

};

console.log( one( plus( nine() ) ) ) // -> 10
console.log( nine( plus( one() ) ) ) // -> 10
console.log( nine() )                // -> 9
console.log( one() )                 // -> 1

答案 3 :(得分:-1)

JavaScript中的每个函数都是一个Function对象。

在JavaScript中,函数是第一类对象,因为它们可以像任何其他对象一样具有属性和方法。它们与其他对象的区别在于可以调用函数。

因此,就像对象可以从一个函数传递到另一个函数一样,您可以传递函数引用

例如:

function add(var a, var b){
   return a+b;
}

function multiply(var a, var b){
    return a*b;
}

var compute(var a, var b, var operation){

    console.log(operation(a,b));

}

一旦你添加了paranthesis (),函数就会被立即调用,它不再是一个引用。如果碰巧分配了函数执行的返回值,则将其分配给LHS变量。

例如:var result = compute(10,20,add); // 20

否则它会被调用compute的函数堆栈帧丢失。