본문 바로가기
프로그래밍 개발/JS 기본 언어

Javascript 함수의 호출

by Jinseok Kim 2020. 11. 12.
반응형

 

 

함수의 호출

 

 

 

JavaScript는 함수를 호출하는 특별한 방법을 제공한다.

 

 

function func(){
}
func();

 

  • 위의 코드에서 함수 func는 Function이라는 객체의 인스턴스(실행중인 임의의 프로세스)다.
  • 따라서 func객체 Function이 가지고 있는 메소드들을 상속하고 있다.
  • 대표적인 예로 메소드는 Function.applyFunction.call이다. 

 

 

 

 

 

 

function sum(arg1, arg2){
    return arg1+arg2;
}
alert(sum.apply(null, [1,2]))

 

  • 위의 코드를 보면 함수 sum은 Function 객체의 인스턴스다.
  • 그렇기 때문에 객체 Function 의 메소드 apply를 호출 할 수 있다.
  • apply 메소드두개의 인자를 가질 수 있는데, 첫번째 인자는 함수(sum)가 실행될 맥락이다. 

 

 

 

 

 

 

 

 

 

어떤 맥락으로 apply가 샐행되는가

 

 

 

 

 

o1 = {val1:1, val2:2, val3:3}
o2 = {v1:10, v2:50, v3:100, v4:25}
function sum(){
    var _sum = 0;
    for(name in this){
        _sum += this[name];
    }
    return _sum;
}
alert(sum.apply(o1)) 
alert(sum.apply(o2)) 

 

  • 우선 두개의 객체를 만들었다. o1는 3개의 속성을 가지고 있다. 각각의 이름은 val1, val2,val3이다. o2는 4개의 속성을 가지고 있고 o1과는 다른 속성 이름을 가지고 있고 속성의 수도 다르다.
  • 그 다음엔 함수 sum을 만들었다. 이 함수는 객체의 속성을 열거할 때 사용하는 for in 문을 이용해서 객체 자신(this)의 값을 열거한 후에 각 속성의 값을 지역변수 _sum에 저장한 후에 이를 리턴하고 있다.
  • 객체 Function의 메소드 apply의 ()안에 들어갈 첫번째 인자함수가 실행될 맥락이다. 
  • 한마디로 sum.apply(o1)함수 sum객체 o1이 sum인자로 들어간 메소드로 만들고 sum을 호출한 후에 sum을 삭제한다.
  • 이때 메소드sum함수에 함수인자로 들어온o1은 'this=자신을 감싼 함수의 인자'이므로 sum의 this로 들어가게 된다.

 

 

 

 

 

function sum(){
    var _sum = 0;
    for(name in this){
        _sum += this[name];
    }
    return _sum;
}
o1 = {val1:1, val2:2, val3:3, sum:sum}
o2 = {v1:10, v2:50, v3:100, v4:25, sum:sum}
alert(o1.sum());
alert(o2.sum()); 

 

  • apply이라는 메소드에 대한 이해를 위해 임의로 위의 코드는 apply을 쓰지않고 o1, o2 객체 안에 sum:sum을 입력하는 것을 통해 sum 함수가 객체안에 들어가 메소드가 될 자격인 <객체안에 함수가 들어있게 되므로 '객체명.함수명'을 호출할 수 있게 하였다. >
  • 그리고 정상적인 메소드 객체를 호출하는 것처럼 aler(o1,sum());('객체명.함수명')로 바꿔주었다.
  • 위의 결과처럼 185, 6 말고도 뒤따라오는 sum 함수의 내용까지 결과로 나오는 이유는  함수 for in문으로 객체 o1의 값을 열거할 때 함수 sum도 포함되기 때문이다.
  • 이처럼 apply 메소드를 쓰지 않아 sum 함수를 삭제하지 못하였기 때문인 것을 확인 할 수 있다.
  • 즉 o1을 sum.apply의 인자로 주게 되면 sum.apply(o1)은 독립적으로 있던 함수 sum을 객체 o1에 속하게 하여 method로 만들고 그렇게 sum.apply(o1)가 o1.sum()이 되어 동작을 하게 되면sum을 o1에 속하지 않게 하는 것을 확인할 수있다.

 

 

 

 

 

 

최종 정리

 

  • sum의 o1 소속의 메소드가 된다는 것은 이렇게 바꿔 말할 수 있다. 함수 sum에서 this의 값이 전역객체가 아니라 o1이 된다는 의미다.
  • 원래는 객체 안에 함수가 들어있는 관계-함수가 method인 경우로서만 객체명.함수명으로 호출이 가능한건데 apply를 통해 그렇게 호출한 샘으로 치는 것이다.
  • 즉, 어떠한 객체와 독립적으로 존재하는 함수를 '함수명.apply(객체명)'로 불러내면 그 순간 그 함수는 그 객체의 method가 되어 '객체명.함수명'을 한 샘이 되는 거다.
  • 일반적인 객체지향 언어에서는 하나의 객체에 소속된 함수는 그 객체의 소유물이 된다. 하지만 JavaScript에서 함수는 독립적인 객체로서 존재하고, apply나 call 메소드를 통해서 다른 객체의 소유물인 것처럼 실행할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

댓글