2010-04-29 6 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 (조지, 존)라고하는 경우는 두 번째 버전을 사용합니다.

내가 사용한 예제를 수행하는 다른 방법이있을 수 있지만, 그 개념이 자바 스크립트에서 소리인지 궁금해하고 있습니다.

답변

10

JavaScript는 함수 오버로딩을 지원하지 않습니다. 그러나

당신은 할 수 있습니다 :

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

JavaScript로 메소드 오버로드를 구현하는 표준 방법입니까? – Pierreten

+0

고마워, 나는 그 종류의 일에 대한 용어가 뭔지 몰랐다. (당연히 내 Google 검색 결과가 빨랐다!). – Choy

+0

또한 나는 당신이 당신의 예에서 엄격한 평등을 사용하고 있음을 주목합니다. 내가 실제로 그것을 통과 할 때 친구가 정수인지 문자열인지는 중요할까요? abc (george, john) 또는 abc (george, "5") 대신 abc (george, 5)를 사용하십시오. – Choy

2

그래는, 참으로, 자바 스크립트는 기본적으로이 작업을 수행합니다. 기능이있는 경우 :

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

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

아니요, 네이티브 자바 스크립트는 함수 오버로드를 허용하지 않습니다.

해결 방법은 단지 해당 매개 변수를 보내지 마십시오. 마지막 매개 변수에서 정의되지 않게됩니다.

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; 
} 
관련 문제