2011-07-06 63 views
2

我有幾個陣列,像這樣:如何將字符串數組作爲參數傳遞給函數?

var galImgs = ["http://domain.tld/gallery/image-001.jpg", 
       "http://domain.tld/gallery/image-002.jpg", 
       "http://domain.tld/gallery/image-003.jpg"], 
    preloadImgs = []; 

我想使用一個簡單的循環for加載從值的圖像的galImgs陣列中,像這樣:

function preload() { 
    for (i = 0; i < preload.arguments.length; i++) { 
    preloadImgs[i] = new Image(); 
    preloadImgs[i].src = preload.arguments[i]; 
    } 
} 

但是,調用

preload(galImgs); 

傳遞數組作爲單個字符串,而不是用逗號分隔的字符串。我怎樣才能通過galImgs數組,因此它會被讀作個別參數?

+2

爲什麼不用'galImgs'參數聲明函數? '函數預加載(galImgs){...}' – Nalum

回答

4

但是,調用

preload(galImgs);

通行證在數組中作爲單個字符串,而不是用逗號分隔的字符串。

不,它通過陣列,而不是字符串英寸實際上,你已經走在你的preload功能太麻煩,只需使用你提供的數組:

function preload(a) { 
    for (i = 0; i < a.length; i++) { 
     preloadImgs[i] = new Image(); 
     preloadImgs[i].src = a[i]; 
    } 
} 

(和聲明函數內的i變量,我還沒有在上面添加;作爲它是,你正在墮入The Horror of Implicit Globals。)

這具有不使用arguments僞陣列的優勢,這在大多數實現中性能受到影響。

如果你想,雖然,你可以使用數組離散參數傳遞給preload,通過apply功能:

preload.apply(undefined, galImgs); 

第一個參數是用於this函數中,你可以默認使用undefined;第二個參數是數組,它將作爲離散參數顯示在函數中。

+1

謝謝,這是非常有用的。超越和超越。乾杯! –

+0

@Isaac:不用擔心,很高興幫助。最好, –

1

您正在尋找apply方法:

preload.apply(null, galImgs); 

應該這樣做!

2

問題是您使用參數關鍵字來查找傳入事件。你真正想要的是

function preload(images) { 
    for (i = 0; i < images.length; i++) { 
    preloadImgs[i] = new Image(); 
    preloadImgs[i].src = images[i]; 
    } 
} 

爲了幫助您更好地瞭解,你的老辦法是,除了一件事很好..

preload.arguments.length == 1 
preload.arguments[0] == galImgs 
preload.arguments[0][0] == galImgs[0] 
+0

而且''arguments''上不需要'preload.'前綴。 「爭論」會導致嚴重的表現懲罰。 :-) –

+0

@TJ是的,都是真的!希望他知道爲什麼它不起作用,那麼我們什麼是最優的。 –

+0

是的,這很有幫助;在這種情況下,它顯示了我使用多少額外的代碼:) –

0

沒有什麼可擔心有將其視爲一個字符串。只需向數組提供索引,您就可以獲得單個字符串。

galImgs [0]會返回你字符串「HTTP://domain.tld/gallery/image-001.jpg」

可以使用gallmgs是一個數組對象,你將有所有的訪問器在這個數組中。嘗試gallmgs.length。