为什么Javascript是在.shift()之后使用的一组额外括号?

时间:2014-01-20 05:00:55

标签: javascript

在下面,为什么在queue.shift()之后添加(输入)?

var puzzlers = [
  function ( a ) { return 8*a - 10; }, 
  function ( a ) { return (a-3) * (a-3) * (a-3); }, 
  function ( a ) { return a * a + 4; },
  function ( a ) { return a % 5; }
];

var start = 2;

var applyAndEmpty = function( input, queue ) {
  var length = queue.length;
  for(var i = 0; i<length; i++){
    input = queue.shift()(input);
  }
  return input;
};

alert(applyAndEmpty(start, puzzlers));

很明显,将输入移动到shift()括号中,它返回函数本身而不是正确的值。但是之后放置(输入)的指导原则是什么(我找不到相关的文档)?

2 个答案:

答案 0 :(得分:4)

因为数组的元素是函数。函数是JavaScript中的对象;它们可以传递,存储在数组中并从其他函数返回。你可以写成:

var fn = queue[0]; // a function object
var input = fn(input); // execute the function

现在您已了解第一类函数,另一种执行序列(或队列)的方法是组合,其中不是执行函数,而是分配值,然后执行下一个函数,您将创建一个函数是所有其他函数的组合,因为它们的输入和输出匹配,例如:

function compose() {
  return [].reduce.call(arguments, function(f,g) {
    return function() {
      return g(f.apply(this, arguments));
    };
  });
};

var puzzle = compose.apply(null, puzzlers);
var result = puzzle(2);
console.log(result); //=> 3

答案 1 :(得分:0)

就像elclanrs所说,数组中的对象是函数,这是一个例子

function yell(saying){
    alert(saying);
}

function whisper(secret){
    console.log(secret);
}

var waysOfSpeaking = [yell, whisper];

// let's yell
waysOfSpeaking[0]('DANGER');

// let's whisper
waysOfSpeaking[1]('I like you');