ํด๋ก์ ๋
๋ฐํ๋๋ ํจ์๊ฐ ๋ฐํ์ํจ ํจ์์ ๋ณ์ ํ๊ฒฝ์ ๋ฌถ์ด์(closing) ๊ธฐ์ตํ๊ณ ์๋ ๊ฐ๋ ์ ๋งํ๋ค.
์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ํจ์์ ์คํ์ด ์ข ๋ฃ๋์ด ์ฝ ์คํ์์ ์ ๊ฑฐ๋๋ฉด ํด๋น ํจ์ ๋ด๋ถ์ ์ ์ธ๋ ๋ณ์์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค. ํ์ง๋ง ๋ฐํ๋ ํจ์๋ ์์ ์ ๋ฐํ์ํจ ํจ์๊ฐ ์ฝ ์คํ์์ ์ ๊ฑฐ๋์ด๋ ์ฌ์ ํ ๊ทธ ์ค์ฝํ์ ์ ๊ทผํ์ฌ ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๊ฒ ๋๋ค.
์ด๋ ๋ฐํ๋ ํจ์๋ ์์ ์ด ํธ์ถ๋ ๋๊ฐ ์๋๋ผ ์ ์ธ๋ ๋์ ํ๊ฒฝ(Lexical Environment)์ ๊ธฐ์ตํ๊ณ ํด๋ก์ ์ค์ฝํ๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ฝ ์คํ์ ๋ฐํ์ํจ ํจ์๊ฐ ์๋๋ผ๋ ์ค์ฝํ ์ฒด์ธ์ ํตํด ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ดํด๋ฅผ ๋๊ธฐ ์ํ ๊ฐ๋จํ ์์ ์ด๋ค.
// inner ํจ์๋ฅผ ๋ฐํ์ํค๋ ํจ์
function outer() {
const outerText = 'I am outer function';
// ๋ฐํ๋๋ ํจ์
return function inner() {
console.log(outerText);
}
}
const closureFn = outer();
closureFn(); // I am outer function
11๋ฒ์งธ ๋ผ์ธ์์ outer
ํจ์๋ฅผ ํธ์ถํ๋ฉด ํด๋น ํจ์์ ์ปจํ
์คํธ๊ฐ ์ฝ ์คํ์ ์์ธ๋ค. ๊ทธ๋ฆฌ๊ณ outer
ํจ์์ ์คํ์ด ์ข
๋ฃ๋๋ฉด closureFn
๋ณ์์๋ outer
ํจ์๊ฐ ๋ฐํํ inner
ํจ์๊ฐ ๋ด๊ธฐ๊ฒ ๋๊ณ , ์ฝ ์คํ์์๋ outer
ํจ์๊ฐ ์ ๊ฑฐ๋๋ค.
๊ทธ ๋ค 12๋ฒ์งธ ๋ผ์ธ์์ closureFn
ํจ์๋ฅผ ํธ์ถํ๋๋ฐ, ์ด๋ ๋ด๋ถ์ ์ผ๋ก outer
ํจ์์ ์ ์ธ๋์๋ outerText
๋ณ์๋ฅผ ์ฐธ์กฐํ๋ค. closureFn
ํจ์์๋ outerText
๋ผ๋ ๋ณ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ค์ฝํ ์ฒด์ธ์ ํตํด ๋ณ์๋ฅผ ์ฐพ์์ผ ํ๋๋ฐ ์ฝ ์คํ์๋ ๋์ด์ outer
ํจ์๊ฐ ์๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ closureFn
ํจ์๋ ์ ์์ ์ผ๋ก outerText
๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด์ ๋ ๋ฐ๋ก closureFn
ํจ์๊ฐ ํด๋ก์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ํด๋ก์ ํจํด ํ์ฉํ๊ธฐ
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ฐ๊ด๋ ๋ฐ์ดํฐ์ ๋์์ ๋ฌถ์ด์ ์ฌ์ฉํ ์ ์๋ค. ๋ฌผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์ด๋ฏธ ํ์ฐธ ์ ๋ถํฐ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค์ง๋ง, ๋ฆฌ์กํธ๋ก ๊ฐ๋ฐํ๋ฉด ํด๋์ค๋ฅผ ์ฐ๊ธฐ๊ฐ ์ ๋งคํ ๋๊ฐ ๊ต์ฅํ ๋ง๋ค.
๊ทธ๋ฐ๋ฐ ์ต๊ทผ์ ๋ณ์์ ๊ฐ์ ๊ณ์ ๊ธฐ์ตํ๊ธฐ ์ํด ํด๋ก์ ๋ฅผ ํ์ฉํ๋ ์ฌ๋ก๊ฐ ์์ด ๊ณต์ ํด๋ณด๋ ค๊ณ ํ๋ค. ์์๋ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณ๊ฒฝํ ๋ ์ ๋ ฅ๋ฐ์ ์ ๋น๋ฐ๋ฒํธ์ ์ ๋น๋ฐ๋ฒํธ ํ์ธ์ ๋ํ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ฒ๋ฆฌํ ๋์ด๋ค.
๋จผ์ ์ด๋ฐ ๊ตฌ์กฐ์ input์ด ์๋ค๊ณ ๊ฐ์ ํ์.
function Form() {
const { validatePassword } = validator();
const handleChange = (e) => {
const { name, value } = e;
validatePassword(name, value);
}
return (
<>
<input type="password" name="password" value={password} onChange={handleChange} />
<input type="password" name="confirm" value={confirm} onChange={handleChange} />
</>
)
}
์ด ๋ name์ด password
์ผ ๋ ๊ทธ ๊ฐ์ ์ ์ฅํด๋์์ผ confirm
๊ฐ์ด ์
๋ ฅ๋์ ๋ password
์ ๋น๊ตํ์ฌ ์ผ์นํ์ง ๋น๊ต๋ฅผ ํ ์ ์๋ค. ๊ทธ๋์ ์๋์ ๊ฐ์ด ํด๋ก์ ๊ฐ๋
์ ํ์ฉํ์ฌ ํจ์๋ฅผ ๋ง๋ค์๋ค. ์์ฃผ ๊ฐ๋ตํ๊ฒ ๋๋๋ง ๋๋ ์ ์๊ฒ ์์ฑํ๋ค.
function validator() {
let password;
function validatePassword(name, value) => {
if(name === 'password') {
password = value;
}
if(name === 'confirm') {
// password์ value๊ฐ ๊ฐ์์ง ๋น๊ต
}
}
return {
validatePassword
}
}
๋๋ ๊ณตํต handleChange
ํจ์๋ฅผ ์ต๋ํ ๊นจ๋ํ๊ฒ ์ ์งํ๊ณ ์ถ๊ธฐ๋ ํ๊ณ ์ ํจ์ฑ ๊ฒ์ฌ ํจ์๋ค๋ผ๋ฆฌ ๋ฌถ์ด์ ๊ด๋ฆฌํ๋ ค๊ณ ์ด ๋ฐฉ์์ ํํ๋๋ฐ, ๊ตณ์ด ํด๋ก์ ๋ก ๊ตฌํํ์ง ์๊ณ ์ ํจ์ฑ ๊ฒ์ฌ ํจ์์ ํ๋ผ๋ฏธํฐ๋ก password
์ confirm
๊ฐ์ ํจ๊ป ๋๊ฒจ์ฃผ๋ ๊ฒ์ผ๋ก๋ ์ถฉ๋ถํ ์ ์๋ค!
'๐ป๐ > ๊ฐ๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TS] ๋น ๊ฐ์ฒด์ ๋ํ ์ฌ๋ฐ๋ฅธ ํ์ (0) | 2022.09.03 |
---|---|
[react-youtube] videoId์ ๋ฐ๋ผ ์์์ด ๋ณ๊ฒฝ๋์ง ์์ ๋ (0) | 2022.09.02 |
[JS] ํธ์ด์คํ (Hoisting) (0) | 2022.08.28 |
[ESLint] import/order ๊ท์น ์ค์ ํ๊ณ ๋ค์ฃฝ๋ฐ์ฃฝ import ์ฝ๋ ๊ฐ์ ํ๊ธฐ (3) | 2022.08.07 |
[JS] ์ด๋ฒคํธ์ target๊ณผ currentTarget ์ฐจ์ด (with ๋ฒ๋ธ๋ง) (0) | 2022.08.06 |