JavaScript/3주차
12. 명시적 this 바인딩 및 유사배열객체
tnals634
2023. 5. 24. 20:55
상황별 규칙을 깨고 명시적으로 지정하는 방법
1.call
// 명시적 this binding
// 상황별 규칙을 깨고 명시적으로 지정하는 방법
// call, apply, bind
// 1. call
var func = function (a, b, c) {
console.log(this, a, b, c);
};
//no binding
func(1, 2, 3); //global을 바로보고 있다.
//명시적 binding
//전역객체를 바라보고 있는 시점에서 명시적 바인딩을 한것
func.call({ x: 1 }, 1, 2, 3);
// this , 1, 2, 3
//호출주체가 있는 경우
var obj = {
a: 1,
method: function (x, y) {
console.log(this.a, x, y);
},
};
//method는 obj라는 주체가 있기 때문에 호출의 주체가 명확함
//method 함수 안의 this는 항상 obj를 가리킴
obj.method(2, 3);
//이것도 깰 수 있다.
obj.method.call({a: 4}, 5, 6);
2. apply
//apply
//call과 동일하다.
var func = function (a, b, c) {
console.log(this, a, b, c);
};
//call과 다르게 뒤에 있는 매개변수를 [ ]로 묶어줘야한다.
func.apply({x: 1}, [4, 5, 6]);
- call / apply 메서드 활용
- 1. 유사배열객체(array - like-object)에 배열 메서드를 적용
- 유사 배열의 조건
1. 반드시 length가 필요해야한다.(필수)
2. index 번호가 0번부터 시작해서 1씩 증가해야한다.
예시코드
//객체에는 배열 메서드를 직접 적용X
//유사배열객체에는 call 또는 apply 메서드를 이용해
//배열 메서드를 차용할 수 있다.
var obj = {
0: 'a',
1: 'b',
2: 'c',
length: 3
};
Array.prototype.push.call(obj,'d');
console.log(obj); // {0: 'a', 1: 'b', 2: 'c', 3: 'd', length: 4}
var arr = Array.prototype.slice.call(obj);
console.log(arr); //['a', 'b', 'c', 'd']
=> 실제 배열은 아니다. 배열과 유사하게 나타내는 거다.
this 바인딩 자리에 유사배열 obj를 넣어줌으로써 실행되는거다.
Array.from 메서드
- 배열로 쉽게 바꿔주는 메서드
예시 코드
//Array.from 메서드
//유사 배열
var obj = {
0: 'a',
1: 'b',
2: 'c',
length: 3
};
//객체 -> 배열
var arr = Array.from(obj);
//찍어보면 배열이 출력
console.log(arr); // [ 'a', 'b', 'c' ]