
코어자바스크립트 ch4. 콜백함수를 읽고 제 생각과 함께 정리한 내용입니다.
콜백함수도 함수이기 때문에 기본적으로는 this가 전역객체를 참조하지만, 제어권을 넘겨받을 코드에서 콜백함수에 별도로 this가 될 대상을 지정한 경우에는 그 대상을 참조하게 된다 (p.100)
[1, 2, 3, 4, 5].forEach(function (x) {
console.log(this); // Window
}forEach(callbackFn, thisArg)에 따라서, this를 지정했다면 전역객체를 참조하지 않을 것이다.var obj = {
vals: [1, 2, 3],
logValues: function(v, i){
console.log(this, v, i);
}
};
obj.logValues(1, 2);
[4, 5, 6].forEach(obj.logValues);
고차함수는 함수를 인자로 전달하거나, 결과로 함수를 반환하는 함수이다.
고차함수는 매개변수를 통해 전달받은 콜백함수의 호출 시점을 결정해서 호출한다.
고차함수에 콜백함수를 전달할 때 콜백 함수를 호출하지 않고 함수 자체를 전달해야 한다.
function funcA(callback) {
callback()
}
function funcB(){
console.log('콜백함수 B')
}
console.log(funcA(funcB)) // '콜백함수 B'
이 코드에서 funcA는 콜백함수를 인수로 받는 고차함수이고, funcB는 콜백함수로서 호출되고 있다.
고차함수는 외부 상태 변경이나 가변 데이터를 피하고 불변성을 지향하는 함수형 프로그래밍에 기반을 두고 있다.
즉, 고차함수는 함수형 프로그래밍에서 유용하게 쓰일 수 있다. 왜그럴까?
function sumOfSquares(arr) {
let sum = 0;
for (let i = 0; i < arr.length; i++) {
sum += arr[i] * arr[i];
}
return sum;
}
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const result = sumOfSquares(numbers);
console.log(result);
function sumOfEvenSquares(arr) {
return arr
.map((num) => num * num) // 제곱
.reduce((acc, num) => acc + num, 0); // 합계 계산
}
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const result = sumOfEvenSquares(numbers);
console.log(result); // 출력: 220
function getData() {
let tableData;
axios.get('https://domain.com/products/1', function (response) {
tableData = response;
})'
return tableData;
}
console.log(getData()); // undefined콜백을 사용하지 않으면 비동기로 처리되어 데이터를 불러오기전에 tableData를 반환한다.
function getData(callbackFunc) {
let tableData;
axios.get('https://domain.com/products/1', function (response) {
callbackFunc(response);
});
}
getData(function(tableData) {
console.log(tableData);
}
axios.get의 response 데이터가 callback에 전달되어 실행된다.
비동기 작업이 맞이할 미래의 완료 또는 실패와 그 결과 값을 나타냄
new Promise(function(resolve, reject) {
// ...
}
순회 가능한 객체에 주어진 모든 프로미스가 이행한 후, 혹은 프로미스가 주어지지 않았을 때 이행하는 promise를 반환한다.
- 입력값으로 들어온 프로미스 중 하나라도 rejected 된다면
promise.all()은 즉시 거부한다.Promise.settled()는 모든 프로미스가 완료될 때까지 기다린다.
async/await는 promise를 더 편하게 사용할 수 있다.
promise의 단점을 보완
async: promise를 반환한다는 것을 선언
await: 해당 promise의 상태가 바뀔 때까지 기다림
promise에서 하던 catch() 예외처리는 어떻게 할까?
async function f() {
await Promise.reject(new Error("에러 발생!"));
}
async function f() {
throw new Error("에러 발생!");
}
async function handleSubmit() {
try {
const paymentData = await paymentWidget.requestPayment({
orderId: "KOISABLdLiIzeM-VGU_8Z", // 주문 ID
orderName: "토스 티셔츠 외 2건" // 주문명
});
console.log(paymentData);
return paymentData;
} catch (error) {
console.log(error.message);
}
}