Jieunny์ ๋ธ๋ก๊ทธ
Unit 9. [JS]ํด๋ก์ ๋ณธ๋ฌธ
๐ฃ ํด๋ก์ ํจ์
โ๏ธ ํ์ดํ ํจ์
const add = (x, y) => x + y;
add(5, 7) // 12
โ๏ธ ํ์ดํ๋ฅผ ๋ ๋ฒ ์ฌ์ฉ
const adder = x => y => x + y;
adder(5)(7); // 12
typeof adder(5) // 'function'
adder(5) // y => x + y ์ ์์ฒด๊ฐ ๋ฆฌํด๊ฐ์.
ํจ์์ ํธ์ถ์ด ๋ ๋ฒ ๋ฐ์ํ๋ค.
adder(5)์ ๋ฆฌํด ๊ฐ์ด ํจ์์์ ์๋ฏธ -> (y => x + y) ์์ฒด๊ฐ adder(5)์ ๋ฆฌํด๊ฐ์ด๋ค.
โ๏ธ ํด๋ก์ ํจ์์ ๊ธฐ๋ณธ ํํ
const adder = function(x) {
return function(y) {
return x + y;
}
}
1๏ธโฃ ํจ์๋ฅผ ๋ฆฌํดํ๋ ํจ์
2๏ธโฃ ํด๋ก์ ์ ํต์ฌ์ '์ค์ฝํ๋ฅผ ์ด์ฉํด์ ๋ณ์์ ์ ๊ทผ์ ๋ซ๋(closure) ๋ฐ'์ ์๋ค.
โฐ ๋ฆฌํดํ๋ ํจ์์ ์ํด ์ค์ฝํ๊ฐ ๊ตฌ๋ถ๋๋ค.
โฐ ์ ์์์์ x๊ฐ ์ ์ธ๋ ํจ์๋ '์ธ๋ถ ํจ์', y๊ฐ ์ ์ธ๋ ํจ์๋ '๋ด๋ถ ํจ์'๋ผ๊ณ ๋ถ๋ฅธ๋ค.
=> ์ด ํด๋ก์ ํจ์๋ ์ค์ฝํ๊ฐ ๋ถ๋ฆฌ๋์ด ์๋ค๋ ์๋ฏธ.
๐จ ๋ด๋ถ ํจ์์ ์ ์ธ๋ ๋ณ์๋ ์ธ๋ถ ํจ์๊ฐ ์ฌ์ฉํ ์ ์๋ค.
๐จ 3๏ธโฃ ์ธ๋ถ ํจ์์ ์ ์ธ๋ ๋ณ์๋ ๋ด๋ถ ํจ์๊ฐ ์ฌ์ฉํ ์ ์๋ค.
๐ฃ ํด๋ก์ ์ ํ์ฉ
โ๏ธ ์ธ๋ถ ํจ์์ ์คํ์ด ๋๋๋๋ผ๋, ์ธ๋ถ ํจ์ ๋ด ๋ณ์๊ฐ ๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ฅ๋๋ค.
const adder = function(x) {
return function(y) {
return x + y;
}
}
const add5 = adder(5); // y => x + y ์ฌ๊ธฐ์ x์ 5๋ผ๋ ๊ฐ์ด ๋ด๊ฒจ์์.
add5(7) // 12 y์ 7์ด๋ผ๋ ๊ฐ์ ๋ฃ์.
add5(10) // 15
๋ณ์ add5 ์๋ ํด๋ก์ ๋ฅผ ํตํด ๋ฆฌํดํ ํจ์๊ฐ ๋ด๊ฒจ ์๋ค.
add5 ๋ adder ํจ์์์ ์ธ์๋ก ๋๊ธด 5๋ผ๋ ๊ฐ์ x ๋ณ์์ ๊ณ์ ๋ด๊ณ ์๋ค. (์ธ๋ถ ํจ์์ ์คํ์ด ๋๋ฌ๋๋ฐ๋)
์ธ๋ถ ํจ์ ์คํ์ ์ด๋ฏธ ๋๋ฌ์ง๋ง, add5(7) ์ฒ๋ผ x=5 ๋ผ๋ ๊ฐ์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
โ๏ธ ํด๋ก์ ๋ก HTML ๋ฌธ์์ด ๋ง๋ค๊ธฐ
const tagMaker = tag => content => `<${tag}>${content}</${tag}>`
const divMaker = tagMaker('div');
divMaker('hello'); // '<div>hello</div>' ์ธ๋ถ ํจ์๊ฐ ๋๋๋ tag๋ ๊ณ์ div๋ฅผ ๋ด๊ณ ์๊ณ ์ฌ์ฉ๊ฐ๋ฅํจ.
divMaker('codestates'); // '<div>codestates</div>'
const anchoMaker = tagMaker('a');
anchoMaker('go'); // '<a>go</a>'
anchorMaker('urclass'); // '<a>urclass</a>'
ํน์ ๋ฐ์ดํฐ๋ฅผ ์ค์ฝํ ์์ ๊ฐ๋์ด ๋ ์ฑ๋ก ๊ณ์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋ค.
โ๏ธ ํด๋ก์ ๋ชจ๋ ํจํด
โ๏ธ ๋ชจ๋ํ : ํจ์์ ์ฌ์ฌ์ฉ์ฑ์ ๊ทน๋ํํ์ฌ ํจ์ ํ๋๋ฅผ ์์ ํ ๋ ๋ฆฝ์ ์ธ ๋ถํ ํํ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ.
const makeCounter = () => {
let value = 0;
return {
increase: () => {
value = value + 1
},
decrease: () => {
value = value - 1
},
getValue: () => value
}
}
const counter1 = makeCounter();
counter1.increase();
counter1.decrease();
counter1.getValue(); // 0
const counter2 = makeCounter();
counter2.decrease();
counter2.decrease();
counter2.getValue(); // -2
๋ด๋ถ ํจ์๋ฅผ ๊ฐ์ฒด์ ๋ด์ ์ฌ๋ฌ ๊ฐ์ ๋ด๋ถ ํจ์๋ฅผ ๋ฆฌํดํ๋๋ก ๋ง๋ ๋ค.
counter1 ์ { increase: f, decrease: f, getValue: f } ๊ฐ์ฒด์ด๋ค.
๐จ ์ด๋ค ๊ฒฝ์ฐ์๋ value ๋ ์ง์ ์์ ์ด ๋ถ๊ฐ๋ฅ ํ๋ค -> ์ธ๋ถ ์ค์ฝํ์์๋ ๋ด๋ถ ์ค์ฝํ์ ๋ณ์์ ์ ๊ทผ ํ ์ ์๊ธฐ ๋๋ฌธ
โฐ ๋์ , ๋ฆฌํดํ๋ ๊ฐ์ฒด๊ฐ ์ ๊ณตํ๋ ๋ฉ์๋๋ฅผ ํตํด value ๊ฐ์ ๊ฐ์ ์ ์ผ๋ก ์กฐ์ ํ ์ ์๋ค. -> ์ ๋ณด์ ์ ๊ทผ ์ ํ(์บก์ํ)
๋ง์ฝ ์ค์ฝํ๋ก value๋ฅผ ๊ฐ์ธ์ง ์์๋ค๋ฉด value๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด์๋ value์ ๊ฐ์ด ์ ์ญ ๋ณ์์ฌ์ผ ํ์ ๊ฒ์ด๋ค.
ํด๋ก์ ๋ก ๋ถํ์ํ ์ ์ญ ๋ณ์ ์ฌ์ฉ์ ์ค์ด๊ณ , ๊ฐ์ ์์ ํ๊ฒ ๋ค๋ฃฐ ์ ์๋ค.
counter1๊ณผ counter2์์ value๋ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ด๋ผ์ ์๋ก์๊ฒ ์ํฅ์ ๋ผ์น์ง ์๋๋ค.
'CodeStates > learning contents' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Unit 10. [JS/๋ธ๋ผ์ฐ์ ] DOM ๊ธฐ์ด (0) | 2022.12.26 |
---|---|
Unit 9. [JS]ES6 ์ฃผ์๋ฌธ๋ฒ (0) | 2022.12.23 |
Unit 9. [JS]์ค์ฝํ (0) | 2022.12.22 |
Unit 9. [JS]์์ ์๋ฃํ๊ณผ ์ฐธ์กฐ ์๋ฃํ (0) | 2022.12.22 |
Unit 8. [JS]๊ฐ์ฒด (2) | 2022.12.22 |