개발 이야기/JavaScript

apply, call

석구석구 2019. 5. 21. 01:46

자바스크립트를 개발하다 보면 apply와 call을 사용하는 경우가 생깁니다.

 

1. this 변수에 원하는 값을 할당하고 싶을 때.

2. '파라미터를 담은 배열'을 이용할 때.

 

하나씩 알아보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function thisTest() {
    console.log(this);
}
 
thisTest();
thisTest.apply(5);
thisTest.call({x:10});
 
function drawPage() {
    var str;
    str = '버튼 클릭'
    createBtn();
    //createBtn.call(this, str);
    //createBtn.apply(this, [str]);
}
function createBtn(str) {
    $('<button>생성</button>').click(() => {
        console.log(str);
    }).appendTo($('body'))
}
drawPage();
cs

#5 일반적인 함수 호출시 this는 전역 window객체를 참조하게 됩니다.

#6 apply로 함수 호출시 this값을 첫 번째 파라미터로 받아 실행됩니다.

#7 call로 함수 호출 시 this값을 첫 번째 파라미터로 받아 실행됩니다.

 

아주 멋지군요.! 계속 알아보겠습니다

 

#21 자바스크립트로 화면을 랜더 하는 함수인 drawPage를 실행합니다.

#12 버튼을 생성하는 함수인 createBtn을 호출합니다.

 

#18 과연 str은 호출이 잘 될까요? #13~14번의 주석을 풀어보면서 확인해봅시다.

 

확인해 보셨다면 아시겠지만 첫 번째 파라미터는 this 값, 두 번째 파라미터는 일반적 함수의 파라미터임을 알 수 있습니다.

그런데 apply는 파라미터를 배열에 담아 보내는군요.

이러한 특성은 아주 유용하게 사용됩니다.

 

다음 검정 화면입니다.

1
2
3
4
Math.max(1,2,3);
Math.max([1,2,3]);
Math.max.apply(null, [1,2,3]);
Math.max(...[1,2,3]);
cs

 

Math.max 함수는 파라미터들 중 가장 큰 수를 리턴해줍니다.

#1 3이 리턴되겠군요.

그런데 언제 파라미터를 저렇게 다 넣어주고 있죠. 보통은 엄청나게 많은 수들 중 최대 값을 찾고자 할 텐데요

#2 배열로 넣어 보았더니 NaN이 돌아옵니다. 배열을 받아주지는 않네요.

#3 apply를 통해 실행했더니 잘 동작합니다.

apply는 '파라미터를 담은 배열'을 받고 이를 다시 파라미터들로 전달하거든요. 마치 arguments를 알아서 풀어 처리해주는 거죠.

훌륭합니다.

 

#4 번외로 es6의 전개 구문 (펼치기라고 하죠)을 사용할 수도 있습니다.

 

 

'개발 이야기 > JavaScript' 카테고리의 다른 글

자바스크립트의 동작 원리.  (0) 2019.06.14
프로토타입  (0) 2019.06.12
this  (0) 2019.05.21
자바스크립트와 메모리 구조  (0) 2019.05.21
클래스와 객체 그리고 상속.  (0) 2019.05.21