whatisthis?

javaScript. (21) 함수의 메소드와 argument 본문

WEB STUDY/JAVASCRIPT

javaScript. (21) 함수의 메소드와 argument

thisisyjin 2022. 1. 30. 10:47

 

지난 강의에서는 숫자 / 배열 / 문자열에 대한 메서드를 배웠었다.

(예> Number.toFixed() / Array.join() / String.split() 등)

 

 

javaScript. (9) 배열(Array)

배열에 관한 Method 1) 배열.length let array= [1, 2, 3, 4]; array.length; // 4 배열의 길이를 알려준다. 배열의 요소가 추가/제거 될 때 마다 자동으로 바뀐다. let array = [1, 2, 3, 4, 5]; array.length; /..

mywebproject.tistory.com

 

javaScript. (8) 숫자와 Math 객체

숫자(Number) - 숫자 또한 원시 래퍼 객체 (new Number()) 가 존재하고, 메소드를 가질 수 있다. 더보기 >> Wrapper Object 에 대한 내용은 아래 포스팅 참조. javaScript. 래퍼객체(Wrapper Object) 자바스크립트..

mywebproject.tistory.com

 

 

javaScript. (7) 문자열

문자열(String) - 작은따옴표('') 또는 큰따옴표("") - 백틱기호 (``) + 템플릿 ${} - 문자열도 객체이다. new String() /// object - 콘솔에 new String()이라고 치면 어떤 객체가 나온다. - 문자열은 객체이기..

mywebproject.tistory.com

 

 

사실은 '함수' 메서드가 존재한다.

>> 가장 핵심적인 것은 call / bind / apply 이다.

 

 


 

 

 

 

원래 함수는 선언한 후 호출을 해야 실행된다.

호출하는 방법에는 일반적으로는 뒤에 ()를 붙이지만,

call과 apply로 호출할 수 있다.

 

 

💡  call과 apply

<호출>

  • 함수 뒤에 ()를 붙임
  • call 과 apply 

call은 보통 함수와 똑같이 인자를 넣음

apply인자를 하나의 배열로 묶어 넣음

 

let example = (a,b,c => a+b+c);  // example 함수 선언

example.call(null, 1, 2, 3);
example.apply(null, [1, 2, 3]);

 

** call과 apply가 공통적으로 가진 null인자의 역할은? 

 this를 대체하는 것.

 

var obj = {
  string: 'zero',
  yell: function() {
    alert(this.string);
  }
};
var obj2 = {
  string: 'what?'
};
obj.yell(); // 'zero';
obj.yell.call(obj2); // 'what?'

여기서 객체 두개를 선언하고 각 string값이 zero와 what?임을 주목하자.

분면 yell함수는 obj에 해당하는 메소드임에도 마지막 줄에서

obj.yell.call(obj2)는 what? (obj2의 string값)이 된다.

 

>> 다른 객체의 함수를 자기 것마냥 사용할 수 있음!

 

즉, obj의 this가 obj2로 바뀐 것이므로

obj.yell에서

this.string이 obj2.string이 된 것임.

 

 

this는 기본적으로 window객체를 의미함.

이 때 몇가지 방법으로 window를 다른 것으로 바꿀 수 있음

- call, apply, bind에서 첫번째 인자로 다른것을 넣어주기.

 

let example = (a,b,c => a+b+c);  // example 함수 선언

example.call(null, 1, 2, 3);
example.apply(null, [1, 2, 3]);

첫 번째 인자인 null은 this를 대체하므로 이 값을 바꿔주면 된다. 

 

 

argument는 함수(function)이면 처음부터 갖고 있는 속성으로,

함수에 들어온 인자배열 형식으로 반환한다. (배열은 아님.)

 

 

이 때, argument 자체는 배열이 아니라 배열 메소드 등을 쓰면 에러가 발생하지만

이 때 call이나 apply를 사용하면 제대로 동작한다.

 

>> 배열의 프로토타입에 있는 join 함수를 빌려씀. this는 argument를 가리키게 함.  (call의 첫번째 인자)

 

function example3() {
  console.log(Array.prototype.join.call(arguments));
}
example3(1, 'string', true); // '1,string,true'

Array.prototype.join.call(arguments)

 

** join() 메서드는 배열의 모든 요소를 연결해 하나의 문자열로 만든다.

>> 기본적으로는 구분자가 컴마(,)가 된다?

 

 

💡  bind

 

bind 함수는 함수가 가리키는 this만 바꾸고 호출하지는 않음.

cf> apply, call은 함수의 호출에 사용 + 첫번째 인자(null)는 this를 대체

 

위의 zero와 what? 예제로 비교해보자.

 

var obj = {
  string: 'zero',
  yell: function() {
    alert(this.string);
  }
};
var obj2 = {
  string: 'what?'
};
var yell2 = obj.yell.bind(obj2);
yell2(); // 'what?'

 

마찬가지로 두 객체와 변수 string / 함수 yell을 선언한다.

call과 apply에서는 obj.yell.call(obj2); 와 같이 해서 결과가 'what?'이 나왔었다.

즉, 함수를 호출 한 것이고

 

bind에서는 호출은 하지 않지 않고 함수만 반환한다.

obj.yell.bind(obj2)를 했더니 yell 함수의 this가 obj2로 바뀐 것이므로

 

call(this, 1, 2, 3) = bind(this)(1, 2, 3)

라고 할 수 있다.

 

 

>> 즉, bind는 호출이 빠진 call과 apply 쯤이라 생각.

호출하려면 ?   ㅡ  call / apply    ㅡ   인자를 직접 넣으려면 call / 배열로 넣으려면 apply
호출하지 말고 this만 바인딩하려면 ?   ㅡ  bind

 

 


REFERENCE

 

https://www.zerocho.com/category/JavaScript/post/57433645a48729787807c3fd

 

(JavaScript) 함수의 메소드와 arguments - call, apply, bind

안녕하세요. 이번 시간에는 함수의 메소드에 대해 알아보겠습니다. 초보 강좌에서 숫자, 배열, 문자열에 대한 메소드에 대해서만 알려드렸죠. 함수에도 기본 메소드가 있습니다. 하지만 초보 강

www.zerocho.com

이 포스팅은 zerocho님의 javascript 강의를 보고 작성한 글입니다.

공부+기록 용으로 작성한 것이며, 자세한 것은 위 포스팅을 참고하세요!