253p ~ 278p
๐ ๊ฐ์
์ฝ๋์ ๋์. ๋ ๊ฐ์ง์ ๋ฆฌํฉํฐ๋ง์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅ.
๐ ์ฉ์ด ์ ๋ฆฌ
์ผ๊ธ (first-class) : "์ธ์๋ก ์ ๋ฌํ ์ ์๋ค."
์ผ๊ธ ๊ฐ : '์ผ๊ธ'์ธ ๋ฐ์ดํฐ.
์ผ๊ธ ํจ์ : '์ผ๊ธ'์ธ ํจ์.
๊ณ ์ฐจ ํจ์ : ์ผ๊ธ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๊ฑฐ๋ ๋ฆฌํดํ ์ ์๋ ํจ์.
๐ "ํจ์ ๋ณธ๋ฌธ์ ์ฝ๋ฐฑ์ผ๋ก ๋ฐ๊พธ๊ธฐ"
๐ ์ฝ๋ ์์
// 1. ์๋ถ๋ถ ๋ท๋ถ๋ถ ํ์ธ
function arraySet (array, idx, value) {
var copy = array.slice(); // ์๋ถ๋ถ
copy[idx] = value; // ๋ณธ๋ฌธ
return copy; // ๋ท๋ถ๋ถ
}
// 2. ํจ์ ๋นผ๋ด๊ธฐ
function withArrayCopy(array) {
var copy = array.slice();
copy[idx] = value; // ๋ณธ๋ฌธ. ์์ง ์ ๋๋ก ์ ์๋์ง ์์ ์ํ.
return copy;
}
function arraySet(array, idx, value) {
return withArrayCopy(array);
}
// 3. ์ฝ๋ฐฑ ๋นผ๋ด๊ธฐ
function withArrayCopy(array, modify) {
var copy = array.slice();
modify(copy); // ์ฝ๋ฐฑ ํธ์ถ. ์๋์ ๋ณธ๋ฌธ์ ํด๋น.
return copy;
}
function arraySet(array, idx, value) {
return withArrayCopy(
array,
function(copy) {copy[idx] = value;} // ์ฝ๋ฐฑ ์ ๋ฌ
);
}
์๋ฐ์คํฌ๋ฆฝํธ์์ ์ธ์๋ก ์ ๋ฌํ๋ ํจ์๋ฅผ ์ฝ๋ฐฑ(callback) ๋๋ ํธ๋ค๋ฌ ํจ์(handler function) ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ๋ฌผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ ๋ค๋ฅธ ์ปค๋ฎค๋ํฐ์์๋ ์ฌ์ฉํ๋ ์ฉ์ด์ ๋๋ค. ์ฝ๋ฐฑ์ผ๋ก ์ ๋ฌํ๋ ํจ์๋ "๋์ค์ ํธ์ถ๋ ๊ฒ"์ ๊ธฐ๋ํฉ๋๋ค.
๊ณ ์ฐจ ํจ์์ ์ ๋ฌํ๋ ์ฝ๋ฐฑ ํจ์๋, ๊ณ ์ฐจ ํจ์ ์์์ ํธ์ถ๋๋ ๊ผด์ ๋ง๋ ์ธ์์ ๊ฒฐ๊ณผ๊ฐ์ ๊ฐ์ง๊ณ ์์ด์ผ ํจ. ํ์ ์คํฌ๋ฆฝํธ๊ฐ ์ ์๊ฒผ๋์ง ์๊ฒ ๋ค.
๋ธ๋ก๊ทธ์ ์