2010-04-29 34 views
2

是否可以根據傳入的參數數量覆蓋函數?例如:根據傳遞的參數覆蓋Javascript函數

function abc(name) { 
    document.write ('My name is' + name); 
} 

function abc(name,friend) { 
    document.write ('My name is' + name + 'and my best friend\'s name is' + friend); 
} 

所以在HTML如果我只是叫ABC(喬治),將使用該函數的第一個版本,但如果我叫ABC(喬治,約翰),它會使用第二個版本。

可能還有其他的方法來完成我使用的例子,但我只是想知道這個概念在javascript中是否合理。

回答

10

JavaScript不支持函數重載。

但您可以:

if (typeof friend === "undefined") { 
    // do something 
} else { 
    // do something else 
} 
+0

這是在JavaScript實現方法重載的標準呢? – Pierreten 2010-04-29 15:23:05

+0

謝謝,我不知道這個詞是什麼東西(難怪我的谷歌搜索結果被吸引了!)。 – Choy 2010-04-29 15:27:24

+0

另外,我注意到您在示例中使用了嚴格的平等。如果我真的通過它,朋友是整數還是字符串,會有關係嗎?所以abc(喬治,5)而不是abc(喬治,約翰)或abc(喬治,「5」)。 – Choy 2010-04-29 15:34:45

2

是的,的確,JavaScript的默認情況下做到這一點。如果你有一個功能:

function addInts(a, b, c) 
{ 
     if(c != undefined) 
     return a + b + c; 
     else 
     return a + b; 
} 

addInts(3, 4); 
addInts(3, 4, 5); 
0

不,原生Javascript不允許重載函數。

解決方法是隻發送該參數。你會在最後一個參數中得到未定義的。

1

您可以將所需的參數,並通過其餘的對象

abc(name); 
abc(name, {"friend": friend}); 
abc(name, {"friend": friend, "age": 21}); 

function abc(name, extra) { 
    if (!extra.friend) 
     alert("no mates"); 
    for (var key in extra) 
     ... 
} 
4

由於這是這裏沒有提到我以爲我會扔了這一點,有作爲。你也可以使用arguments對象,如果你的唯一目的是覆蓋基於參數的數量(就像你在你的第一句話提到):

switch (arguments.length) { 
    case 0: 
     //Probably error 
     break; 
    case 1: 
     //Do something 
     break; 
    case 2: 
    default: //Fall through to handle case of more parameters 
     //Do something else 
     break; 
}