2011-04-14 172 views
1

函数multiply传递一个回调函数“addOne”。函数乘法返回[3,5,7]。JavaScript“参数” - 通过其他参数传递函数

由于回调函数addOne是函数乘法的参数之一,并且由于函数乘法的参数全部乘以2,为什么回调函数本身(即addOne)乘以2?换句话说,我不希望函数返回,因为函数不是一个数字,而是函数返回[3,5,7]

JavaScript解释器是否知道不会将它乘以2?

function addOne(a) { 
return a + 1; 
} 

function multiply(a,b,c, callback) { 
    var i, ar = []; 
    for (i = 0; i < 3; i++) { 
     ar[i] = callback(arguments[i] * 2); 
    } 
    return ar; 
} 



myarr = multiply(1,2,3, addOne); 
myarr; 

回答

4

因为你的循环的条件是<3(嘿嘿),这意味着它不会标中的回调(最后一个元素)。

您应该考虑进行回调的第一个参数总是和分裂的论点是这样的...

var argumentsArray = Array.prototype.slice.call(arguments), 
    callback = argumentsArray.shift(); 

jsFiddle

然后,callback有回调,您可以用call()apply()或纯()打电话,argumentsArray有你的论点其余作为一个适当的阵列。

+0

o耶,谢谢。 – mjmitche 2011-04-14 06:40:55

+0

我通常知道“call”是什么,但是能否解释它在您编写的示例代码中的工作原理。谢谢。 – mjmitche 2011-04-15 00:08:45

+0

@mjmitche'arguments'变量是一个对象,而不是一个数组,虽然它公开了一些类似数组的属性。为了能够调用'shift()',我们需要它作为一个真正的数组。为此,我们可以使用'call()'将对象作为'this'传递给参数数组,调用'Array'的'slice()'。在不带参数的情况下使用'slice()'时,它会将对象的副本作为数组返回(或者如果在标准数组上使用数组的副本)。 – alex 2011-04-15 00:11:18

0

此行for (i = 0; i < 3; i++) {正在保护你。

你停止打callback参数之前

0

因为你正在运行的循环仅前3个ARGS。 i < 3次运行i = 0,i = 1,i = 2

相关问题