在下面,为什么在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()括号中,它返回函数本身而不是正确的值。但是之后放置(输入)的指导原则是什么(我找不到相关的文档)?
答案 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');