✅ this
앞전 시간에서 우리는 콜백 함수도 함수이기 때문에 기본적으로는 this가 전역객체를 참조한다 라고 귀가 아프도록 들어왔어요. 하지만, 예외사항 기억 나세요? 🙄
🔥제어권을 넘겨받을 코드에서 콜백 함수에 별도로 this가 될 대상을 지정한 경우에는 그 대상을 참조한다.
내부적으로는 어떻게 이걸 가능케 하는 것일까요? 별도의 this를 지정하는 방식을 이해하기 위해서. 그리고, 제어권에 대한 이해를 높이기 위해서 map함수를 직접 구현해 볼까요?
핵심은 call, **apply**에 있어요!
// Array.prototype.map을 직접 구현해봤어요! Array.prototype.mapaaa = function (callback, thisArg) { var mappedArr = []; for (var i = 0; i < this.length; i++) { // call의 첫 번째 인자는 thisArg가 존재하는 경우는 그 객체, 없으면 전역객체 // call의 두 번째 인자는 this가 배열일 것(호출의 주체가 배열)이므로, // i번째 요소를 넣어서 인자로 전달 var mappedValue = callback.call(thisArg || global, this[i]); mappedArr[i] = mappedValue; } return mappedArr; }; const a = [1, 2, 3].mapaaa((item) => { return item * 2; }); console.log(a);
아하, 그러니까 바로 제어권을 넘겨받을 코드에서 call/apply 메서드의 첫 번째 인자에서 콜백 함수 내부에서 사용될 this를 명시적으로 binding 하기 때문에 this에 다른 값이 담길 수 있는 거군요!
아래 코드는 우리가 3주차에서 보았던 코드에요.
(다시 한번) 제어권을 넘겨받을 코드에서 콜백 함수에 별도로 this가 될 대상을 지정한 경우에는 그 대상을 참조한다.
//이젠 이 코드를 좀 더 잘 이해할 수 있어요!!
// setTimeout은 내부에서 콜백 함수를 호출할 때, call 메서드의 첫 번째 인자에
// 전역객체를 넘겨요
// 따라서 콜백 함수 내부에서의 this가 전역객체를 가리켜요
setTimeout(function() { console.log(this); }, 300); // Window { ... }
// forEach도 마찬가지로, 콜백 뒷 부분에 this를 명시해주지 않으면 전역객체를 넘겨요!
// 만약 명시한다면 해당 객체를 넘기긴 해요!
[1, 2, 3, 4, 5].forEach(function (x) {
console.log(this); // Window { ... }
});
//addEventListener는 내부에서 콜백 함수를 호출할 때, call 메서드의 첫 번째
//인자에 addEventListener메서드의 this를 그대로 넘겨주도록 정의돼 있어요(상속)
document.body.innerHTML += '<button id="a">클릭</button';
document.body.querySelector('#a').addEventListener('click', function(e) {
console.log(this, e);
});
'Javascript' 카테고리의 다른 글
콜백 함수 내부의 this에 다른 값 바인딩하기 (0) | 2023.12.18 |
---|---|
콜백 함수는 함수다 (0) | 2023.12.18 |
콜백함수_인자 & this 바인딩 (0) | 2023.12.18 |
콜백함수_제어권 (0) | 2023.12.18 |
콜백함수 현명하게 사용하기 (0) | 2023.12.18 |