2015-05-01 28 views
0

說我有:爲什麼AS3的地圖回調需要額外的兩個參數?

myArray = [1,2,3]; 

而且說我有一個實用程序功能在別處:

add3 = function(val) { 
    return val+3; 
} 

現在,如果我想使用它作爲回調的地圖功能,我必須這樣做像這樣:

add3Callback = function(currentValue, index, array) { 
    return add3(currentValue); 
} 

myArray.map(add3Callback); 

試圖myArray.map(add3)導致「參數計數mismatch」。地圖回調不需要額外的兩個參數會更好,因爲現在我必須將wrappers添加到所有的util函數中,以便在map中使用它們,這違背了在第一個地圖中使用map的一些原因地點。

我在這裏錯過了什麼?爲什麼這些論據是強制性的,其他語言(包括Javascript)似乎沒有這樣做。

+0

「其他語言(包括Javascript)似乎沒有這樣做「這是錯誤的聲明,因爲AS3中的Array映射不是AS3語言的一部分,而僅僅是Array對象的框架實現。地圖排序方法是一種方便的方法,您可以自由使用或不使用,就像您可以自由編寫自己的排序方法一樣。抱怨這種方法的實施是荒謬和毫無意義的,你抱怨使用的方法不適合你的需要,那麼就不要使用它! – BotMaster

+0

除了JavaScript之外,還有哪些其他語言允許您使用不正確的參數調用函數並且不會拋出錯誤? – Aaron

回答

0

因爲就是這樣。

如果你想解決這個問題,只需編寫這樣的函數。爲什麼要爲每個要傳遞給Array.map()的函數編寫一個特定的包裝函數?

function map(array:Array, callback:Function):void 
{ 
    array.map(function(currentValue, index, array):void { callback(currentValue);}); 
} 

這真是奇怪的抱怨包裝功能部件的必要性,要求到對方,並聲稱Javascript來是不同的,因爲在JS,對於範圍的原因,你包在附加功能的東西調用所有的時間,除了在這個案例。

+0

我不認爲你的方式會工作嗎?你需要在那裏有一個return語句,此時調用代碼變成myArray = map(myArray,add3),它根本不起作用。功能方式的好處來自於簡單地使用現有功能而無需任何額外的工作。 –

+0

你的代碼也沒有使用返回值,並且將它添加到我的代碼中是微不足道的。畢竟,我的代碼只是你的'add3Callback'的泛化,說明了你不需要單獨的包裝函數。 – null

0

因爲AS3比JS更嚴格。具體而言,您不能使用不正確的參數調用函數。例如:

function f(a){} 
f(1,2,3); // JS allows this, AS3 does not 

This article可以幫助你理解其背後AS3的設計選擇(其中,順便說一句,是基於ES4這將成爲JS如果它沒有放棄對"political reasons"):

相關問題