1. ์ฝ๋ฐฑ์ด๋?
ํ๋์ ์ฝ๋์ ์ธ์๋ก ๋ค์ด๊ฐ๋ ์คํ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ Call back์ด๋ผ ํ๋ค.
์ด๋ค ํจ์์ ์ธ์๋ก ๋ค์ด๊ฐ๋ ์คํ ๊ฐ๋ฅํ ํจ์๋ฅผ Call back ํจ์๋ผ๊ณ ํ๋ค.
2. ์ฝ๋ฐฑ ์์ 3๊ฐ์ง
(1) ๊ธฐ๋ณธ์ ์ธ ๊ฒ
const a = (callback) => {
console.log("A");
callback();
};
const b = () => {
console.log("B");
};
a(b);
๋งจ ๋ง์ง๋ง ๋ฌธ์ ๋ณด๋ฉด, a๋ผ๋ ํจ์์ ์ธ์๋ก b ํจ์ ์์ฒด๋ฅผ ๋ฃ์๋ค.
๊ทธ๋ฌ๋ฉด console.log(b) ํ์ ๋ ์ฒ๋ผ b ํจ์ ์์ฒด๊ฐ a์ ์ธ์๋ก ๋ค์ด๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ 3๋ฒ์งธ ์ค์ ๋ณด๋ฉด callback()์ ์ธ์๋ก ๋ฐ์ b() ํจ์ ์์ฒด๋ฅผ ์คํํ๊ฒ ๋ค๋ ์๋ฏธ์ด๋ค.
๋ฐ๋ผ์ ์ถ๋ ฅ์ด ๋ค์๊ณผ ๊ฐ๋ค.
(2) ์์ฉ
// ์ฝ๋ฐฑ ํจ์ ์ด์ฉ ์์ (2)
const sum = (a, b, c) => {
setTimeout(() => {
c(a + b);
}, 1000);
};
sum(1, 2, (value) => {
console.log(value);
});
sum(3, 7, (value) => {
console.log(value);
});
์์ ์ฝ๋๊ฐ (1)๊ณผ ๋ฌ๋ผ์ง ์ ์ ํจ์ ์ ์ธ ์์ฒด๋ฅผ ์ธ์ ์ ์ธ๋ถ์์ ํ๋ค๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ c๋ผ๋ ๋งค๊ฐ ๋ณ์์ ์ธ์๋ฅผ ๋ฐ์ ์ถ๋ ฅํ๋ ํจ์ ์์ฒด๊ฐ ๋ค์ด์ค๊ณ , ์ ์งธ์ค์ cํจ์ ํธ์ถ ์, 1+2๋ 3+7์ด ๋ค์ด๊ฐ์ ์ถ๋ ฅ๋๋ค.
(3) ์ฌํ
// ์ฝ๋ฐฑ ํจ์ ์ด์ฉ ์์ (3)
const loadImage = (url, cb) => {
// loadImage๋ผ๋ ํจ์๋ ์ด๋ฏธ์ง ํ๊ทธ๋ฅผ JS ๋ด๋ถ์ ๋ง๋ค๊ณ , ์ด ์ด๋ฏธ์ง ํ๊ทธ์ src์ ์ธ์๋ก ๋ฐ์ url ๊ฐ์ ์ง์ด๋ฃ์.
const imgEl = document.createElement("img");
imgEl.src = url;
imgEl.addEventListener("load", () => {
// addEventLister๋ ์ด๋ฏธ์ง ํ๊ทธ์ ์ด๋ฒคํธ๋ฅผ ์ง์ด๋ฃ๋ ๊ฒ์ด๊ณ ์ด๋ฒคํธ type์ ๋ก๋์. ๋๋ฒ์งธ ์ธ์๋ ํด๋น ์ด๋ฒคํธ ๋ฐ์ ์ ์ผ์ด๋ ๋์์ ๋งํจ.
// "load"-> ํด๋น ์นํ์ด์ง์์ ์ธ ๋ชจ๋ ํ์ผ์ ๋ค์ด๋ก๋๊ฐ ์๋ฃ๋ ๋, 2๋ฒ์งธ ์ธ์ ํจ์ ๋ฐ๋
setTimeout(() => {
cb(imgEl);
}, 1000);
});
};
const containerEl = document.querySelector(".container");
// Html ๋ํ๋จผํธ ๋ด๋ถ์ ํด๋์ค ์ด๋ฆ์ด container์ธ ๋
์์ ์ ํํ๋ค.
// querySelector -> ()์ ํด๋นํ๋ ์์๋ฅผ ์ ํํ๊ฒ ํด์ฃผ๋ ๋
์, ๊ฐ์ class๋ id ์ธ ํ๊ทธ๊ฐ ์์ ๊ฒฝ์ฐ, ์ ํ์ ํด๋นํ๋ ์ฒซ๋ฒ์งธ ์์๋ง ์ ํ
// ํด๋น ์ ํ์์ธ ์์ ๋ชจ๋ ์ ํํ๊ณ ์ถ๋ค๋ฉด ํด๋น ๋ชจ๋๋ฅผ ๋ฐ์ ๋ฐฐ์ด์ ์ ์ฅํ๋ querySelectorAll์ ์จ์ผํจ.
loadImage("https://www.gstatic.com/webp/gallery/4.jpg", (imgEl) => {
containerEl.innerHTML = " "; // ํด๋์ค์ด๋ฆ์ด Container์ธ ์์์ ๋ด๋ถ๋ฅผ ๋น์๋ผ
containerEl.append(imgEl); // ์ธ์๋ก ๋ฐ์ ์์๊ฐ Container ์์ ๋ด๋ถ ๋งจ ๋ง์ง๋ง์ ์ ํ.
});
loadeImage๋ผ๋ ํจ์์ ์ธ์๋ก url๊ณผ ํจ์๋ฅผ ๋ฃ์๋ค. ๋ ๋ฒ์งธ ์ธ์์ ํจ์๋ฅผ call back ํจ์๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ธ์๋ก ๋ค์ด์จ call back ํจ์์ ๋ด์ฉ์ ์์์ class๊ฐ container์ธ ๋ ์์ ์ ํํ๊ณ , ํด๋น ์์์ ์์ ํ๊ทธ๋ฅผ ์ ๋ถ๋ค ์ง์ฐ๊ณ ์ธ์๋ก ๋ฐ์ ํ๊ทธ๋ฅผ ๊ทธ ๋ด๋ถ ๋งจ ๋ง์ง๋ง ์ค์ ๋ถ์ฌ ๋ฃ์ด๋ผ๋ ๋ป์ด๋ค.
์ด์ loadImage๋ฅผ ์ดํด๋ณด๋ฉด
image๋ผ๋ ์์๋ฅผ document ๋ด๋ถ์ ๋ง๋ค๊ณ ,
src์ ์ธ์๋ก ๋ฐ์ uri๋ฅผ ๋ฃ๊ณ
์์ ๋ด๋ถ์ ์ด๋ฒคํธ๋ ๋ฑ๋กํ๋ค.
addEventListener๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ด๋ฒคํธ์ ํ์ , ๋ ๋ฒ์งธ ์ธ์๋ก ํด๋น ์ด๋ฒคํธ๊ฐ ๋ฒ์ด์ง ๋ ๋์ํ ๊ธฐ๋ฅ์ด ๋ค์ด๊ฐ๋ค.
์ฌ๊ธฐ์ ์ฐ์ธ "load"๋ผ๋ ์ด๋ฒคํธ ํ์ ์ ํด๋น ์น ํ์ด์ง์์ ์ธ ํ์ผ์ด ๋ชจ๋ ๋ค์ด๋ก๋ ๋์์ ๋, 2 ๋ฒ์งธ ์ธ์๋ก ๋ฐ์ ๋์์ ์ํํ๋ผ๋ ๋ป์ด๋ค. ์ฆ ์น ํ์ด์ง์ ์ธ ๋ชจ๋ ํ์ผ์ด ๋ค์ด๋ก๋ ๋ ์์ ์ด ์ด๋ฒคํธ ๋ฐ์ ์์ ์ด๋ค.
2๋ฒ์งธ ์ธ์ ์ ๋ด์ฉ์ callback ํจ์ ์์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ค์๋ ์ด๋ฏธ์ง ์์๋ฅผ ์ง์ด๋ฃ๋ ๊ฒ์ผ๋ก ์คํ๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ด๋ฏธ์ง ์์๊ฐ container๋ class์ ์์ ์์ ๋ค์ด๊ฐ์ ์์ฑ๋๋ ๊ฒ์ด๋ค.
3. ์๋กญ๊ฒ ์๊ฒ ๋ ๊ฒ
(1) ์์.addEventListner(type, ๋์)
์์์์ ํน์ ์ด๋ฒคํธ ๋ฐ์ ์ ํํด์ผ ํ ๋์ ๋ฉ๋ด์ผ์ ์ง์ด ๋ฃ๋๋ค.
type์ ๋ฒ์ด์ง ์ด๋ฒคํธ๊ฐ ๋ญ์ง์ ๋ํ ๊ธฐ์ ์ด๋ค. ๋ฌธ์์ด๋ก ์ ํ์๊ณ type์ ๋ฐ๋ผ ์ด๋ฒคํธ ๋ด์ฉ์ด ๋ค๋ฅด๋ค.
๋ ๋ฒ์งธ ์ธ์์ธ ๋์์ ํด๋น ์ด๋ฒคํธ๊ฐ ๋ฒ์ด์ก์ ๋ ํํ๋ ๋์์ด๋ค.
(2)containerEl.innerHTML = " ";
containerEl์ด๋ ์์ ์์ชฝ์ " "์์ ๋ด์ฉ์ ์ ์ด ๋ฃ๋ ๊ฒ์ด๋ค.
"" ์์ HTML ๋ฌธ๋ฒ์ ์์๋ค์ด ์ ํ๋ค.
ํด๋น ์ฝ๋๋ innerH๋ผ๋ id์ ์์๋ฅผ ๊ฐ์ ธ์์ ๊ทธ ์์ ์์ชฝ ์์ ํ๊ทธ๋ก ""์์ ๋ด์ฉ์ ์ง์ด๋ฃ๋ ๊ฒ์ด๋ค.
ํด๋น Dom ๋ฌธ๋ฒ์ ์์ ์์ ์น ์ง์ฐ๊ณ " "์์ ๋ด์ฉ์ผ๋ก ๋ค์ ์ฐ๋ ๊ฒ์ด๋ผ ์ฐ๋ฆฌ ์ฝ๋์ฒ๋ผ, = " "์ผ๋ก ํ๋ฉด
ํด๋น ์์ ๋ด๋ถ๋ฅผ ์น ๋น์ฐ๊ฒ ๋ค๋ ๋ป์ด๋ค.
4. ์ค์ค๋ก ํด๋ณด๊ธฐ
๋ง์ง๋ง ์ฌํ ๋ด์ฉ์ ๋ฐ๋ผ ํด๋ณด์.
// https://blog.kakaocdn.net/dn/yDtgP/btrJaVA4iLN/9QtVWLrCIrUtDz7U4Udsr0/img.jpg
const loadImage = (url, cb) => {
const image = document.createElement("img");
image.src = url;
setTimeout(() => {
cb(image);
}, 1000);
};
const containerEl = document.querySelector(".container");
loadImage(
"https://blog.kakaocdn.net/dn/yDtgP/btrJaVA4iLN/9QtVWLrCIrUtDz7U4Udsr0/img.jpg",
(value) => {
containerEl.innerHTML = "";
containerEl.append(value);
}
);