2012-08-31 49 views
1

我想要修改其用於apply()傳遞數組成員函數通常預期任何數目的參數的一些現有的JavaScript代碼:如何在數組之前使用帶有額外參數的JavaScript「apply」方法?

oldFoo: function(arg /* , ..., argN */) { 
    ... 
} 

var ary = ... 

oldFoo.apply($, ary) 

... other stuff using ary ... 

新的代碼仍然需要任意數量的參數,我仍然有他們作爲一個數組來傳遞,但我也需要一個新的參數來傳遞數組

newFoo: function(someObject, arg /* , ..., argN */) { 
    ... 
} 

var ary = ... 

newFoo.apply($, ???, ary) 

... other stuff using ary ... 

所以我知道我可以做的ary新版本與修改就地如陣列方法之前, pop/push/shift/unshift但我想用我的陣列做各種事情,所以不想修改它的地方。

我知道我可以通過預先設置someObject來構建一個新的臨時數組,但似乎每次都需要多行代碼。

有沒有更具表現力的方式來實現我想要在相同數量的行中做什麼?我錯過了關於apply或關於數組函數返回一個新數組而不是修改一個就地?我已經在使用jQuery,所以如果它有一些有用的東西,那麼香草JavaScript沒有那麼好,那也太好了。

+0

'apply($,???,ary)'不會工作prepending(或appending)是你唯一的選擇我猜.. @David給出了一個很好的例子;) – VDP

+0

@VDP: 「我的手是爲」不知道周圍某處真的發生了什麼「( - : – hippietrail

+0

@大衛:我接受了我已經能夠測試的所有東西,但是我還沒有能夠經歷的許多事情 – hippietrail

回答

5

我會做:

newFoo.apply($, ['foo','bar'].concat(ary)); 

這樣,你就不會修改任何參數現有陣列。從MDN

的concat創建由在其上它被稱爲此 對象中的元素的一個新的數組,接着爲了通過,對於每個參數,該參數(的 的元素,如果參數是一個數組)或 參數本身(如果參數不是數組)。

+0

因此,我想在我的例子中,這將是'newFoo.apply($,[options] .concat(ary))'? – hippietrail

+0

@hippietrail如果'options'是一個數組,你只需要'options.concat(ary)'。如果你不想修改'options',試試'options.slice()。concat(ary)' – David

+0

Oh yeah sorry'options' is a object ,我沒有意識到我的例子沒有透露這一點。 – hippietrail

相關問題