2011-04-14 222 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

相關問題