ECMAScript Function 객체(클래스)
- 이전 페이지 arguments 객체
- 다음 페이지 클로저(clousure)
ECMAScript의 함수는 실제로 완전한 객체입니다.
Function 객체(클래스)
ECMAScript에서 가장 흥미로운 점 중 하나는 함수가 실제로 완전한 객체라는 점입니다.
Function 클래스는 개발자가 정의한 어떤 함수도 나타낼 수 있습니다。
Function 클래스를 통해 직접 함수를 생성하는 문법은 다음과 같습니다:
var function_name = new function(arg1, arg2, ... , argN, function_body)
위의 형식에서 각 arg 이들 모두는 매개변수가 하나입니다. 마지막 매개변수는 함수 본체(실행할 코드)입니다. 이 매개변수는 반드시 문자열이어야 합니다.
그런 다음, 이 함수를 기억해 둡니다?
function sayHi(sName, sMessage) { alert("Hello " + sName + sMessage); }
이렇게 정의할 수도 있습니다:
var sayHi = new Function("sName", "sMessage", "alert(\"Hello \" + sName + sMessage);");
문자열의 관계로 인해 이 형식을 작성하는 것은 어려울 수 있지만, 함수가 참조 타입이며, Function 클래스를 명시적으로 생성한 함수와 같은 행동을 한다는 것을 이해하는 데 도움이 됩니다.
다음 예제를 보세요:
function doAdd(iNum) { alert(iNum + 20); } function doAdd(iNum) { alert(iNum + 10); } doAdd(10); // "20" 출력
알고 계신 것처럼, 두 번째 함수는 첫 번째 함수를 오버로드하여 doAdd(10)이 "20"을 출력하도록 합니다. 그렇지 않으면 "30"을 출력할 것입니다.
이 코드 블록을 다음과 같이 다시 작성하면 이 개념이 명확해집니다:
var doAdd = new Function("iNum", "alert(iNum + 20)"); var doAdd = new Function("iNum", "alert(iNum + 10)"); doAdd(10);
이 코드를 관찰해 보세요, doAdd의 값이 다른 객체를 가리키는 포인터로 변경되었음이 명확합니다. 함수 이름은 함수 객체를 가리키는 참조 값이며, 다른 객체와 같은 행동을 합니다. 심지어 두 변수가 같은 함수를 가리키는 것도 가능합니다:
var doAdd = new Function("iNum", "alert(iNum + 10)"); var alsodoAdd = doAdd; doAdd(10); // "20" 출력 alsodoAdd(10); // "20" 출력
여기서, 변수 doAdd가 함수로 정의되고, 그런 다음 alsodoAdd가 같은 함수를 가리키는 포인터로 선언됩니다. 이 두 변수 모두 함수의 코드를 실행하고 같은 결과 - "20"을 출력할 수 있습니다. 따라서 함수 이름이 단지 함수의 변수를 가리키는 것이면, 함수를 다른 함수에 전달할 수 있습니까? 답은 Affirmative입니다!
function callAnotherFunc(fnFunction, vArgument) { fnFunction(vArgument); } var doAdd = new Function("iNum", "alert(iNum + 10)"); callAnotherFunc(doAdd, 10); //출력 "20"
위의 예제에서 callAnotherFunc()은 두 개의 매개변수를 가지고 있습니다 - 호출할 함수와 함수에 전달할 매개변수. 이 코드는 doAdd()을 callAnotherFunc() 함수에 전달하고 매개변수는 10으로, "20"을 출력합니다.
주의:Function 구조 함수를 사용하여 함수를 생성할 수 있지만, 그렇지 않은 것이 좋습니다. 이는 전통적인 방식보다 훨씬 더 느리기 때문입니다. 그러나 모든 함수는 Function 클래스의 인스턴스로 간주되어야 합니다.
Function 객체의 length 속성
이전에 설명한 것처럼, 함수는 참조형 데이터 타입이므로, 그들도 속성과 메서드를 가집니다.
ECMAScript가 정의한 property length는 함수가 예상하는 매개변수 개수를 선언합니다. 예를 들어:
function doAdd(iNum) { alert(iNum + 10); } function sayHi() { alert("Hi"); } alert(doAdd.length); //출력 "1" alert(sayHi.length); //출력 "0"
함수 doAdd()은 매개변수 하나를 정의했으므로, 그 length는 1입니다;sayHi()은 매개변수를 정의하지 않았으므로 length는 0입니다.
기억해야 할 것은, 몇 개의 매개변수를 정의했든지 관계없이 ECMAScript는 최대 25개까지의 임의의 매개변수를 받을 수 있습니다. 이는 《함수 개요》 장에서 설명했습니다. property length는 기본적으로 예상되는 매개변수 개수를 확인하는 쉬운 방법을 제공합니다.
Function 객체의 메서드
Function 객체도 모든 객체와 공유하는 valueOf() 메서드와 toString() 메서드를 가집니다. 이 두 메서드는 모두 함수의 소스 코드를 반환하며, 디버깅 시 특히 유용합니다. 예를 들어:
function doAdd(iNum) { alert(iNum + 10); } document.write(doAdd.toString());
위의 코드는 doAdd() 함수의 텍스트를 출력합니다.직접 시도해보세요!
- 이전 페이지 arguments 객체
- 다음 페이지 클로저(clousure)