2011-05-25 80 views
0

可能重複:
How to create a function and pass in variable length argument list?調用函數帶有可變參數長度

我想打電話給console.log帶有可變參數列表

console.log("a","b") 
console.log("a","b","c") 

,但我得到的參數陣列:

var arr = ["a","b","c"]; 

我想作爲單個變量傳遞而不是完整的數組。 所以console.log(arr)是不是我所期待的,console.log(arr[0],arr[1],arr[2])也不好,因爲我不知道數組的長度。

我該怎麼做?

console.log僅僅是一個例子,我會在不同的問題


UPDATE

How to create a function and pass in variable length argument list?不好使用。因爲根據答案

function dump(a,b) { 
    console.log("a:"+a,"b:"+b); 
} 

var asd = [1,2,3] 

dump.call(this,asd) 

應該給一個輸出:中a:1,b:2代替a:[1,2,3] b:undefined


UPDATE:

也許我的問題是不夠清楚,對不起。

的的console.log是唯一的變量參數的一個例子調用

我想使用同樣的方法對不同的問題

看看這個例子:

function Sum() { 
    var temp = 0; 
    for(var i=0;i<arguments.length;++i) { 
    temp+= arguments[i]; 
    } 
    return temp; 
} 

我想用數組中的不同參數進行調用。

var test1 = [1,2,3]; 
var test2 = [4,5,6]; 

var a = Sum.call(this,test1) //this gives an output "01,2,3" 

var b; 
for(var i=0;i<test2.length;++i) { 
    b = Sum(test2[i]) 
} //this is also bad because it only returns 6 at the last invoke. 
+0

它是重複的。兩個問題都是如何將一個參數數組作爲單獨的參數傳遞給一個函數。在其他問題或答案中甚至沒有提到「Function.call」。你的意思是問'爲什麼'dump.call(this,asd)'輸出結果是「a:[1,2,3] b:undefined」?' – outis 2011-05-25 20:43:54

+2

您繼續使用CALL。使用APPLY。做Sum.apply(this,test1)並看看你得到了什麼。 – squidbe 2011-05-25 21:02:01

+0

你是對的。對不起 – 2011-05-25 21:02:34

回答

7

使用Function.apply

console.log.apply(console, arr); 

這回答你問的問題。如果您打算詢問:

爲什麼dump.call(this,asd)會導致「a:[1,2,3] b:undefined」的輸出?

答案(其中任何文件,會告訴你)是Function.call是可變參數,第一是傳遞給函數後的任何參數,而Function.apply只需要兩個參數:一個值this在應用功能和傳遞給函數的參數數組。

換句話說,Function.call相當於:

function (self) { 
    var args = [].slice.apply(arguments, [1]); 
    return this.apply(self, args) 
} 
+0

對不起。我用電話而不是申請。我有點累 – 2011-05-25 21:02:57

0

不知道你的意思到底是什麼......但是JavaScript是一種動態的語,你可以直接通過圍繞着動態物體。所以你可以這樣做:

var obj = {0:「a」,1:「b」,2:「c」}; console.log(obj);

對象'obj'可以包含儘可能多的屬性,並且可以作爲單個參數傳遞給任何函數。

2

根據您的更新,這種修改將工作:

function dump(a,b) { 
    console.log("a:"+a,"b:"+b); 
} 

var asd = [1,2,3] 

dump.apply(this,asd) 

請注意,你需要使用「應用」而不是「呼」。 但是你的函數規定輸出多少個參數(console.log(「a:」+ a,「b:」+ b)),所以這個值是有限的。你可以請嘗試清楚地解釋爲什麼console.log.apply(console,asd)不會給你你想要的東西?