๋ชฉํ
์ค์ฝํ์ ์๋ฏธ์ ์ ์ฉ ๋ฒ์๋ฅผ ์ดํดํ๋ค.
์ค์ฝํ์ ์ฃผ์ ๊ท์น์ ์ดํดํ๋ค.
์ ์ญ ์ค์ฝํ์ ์ง์ญ ์ค์ฝํ์ ์ฐจ์ด๋ฅผ ์ดํดํ๋ค.
block scope์ function scope์ ์ฐจ์ด๋ฅผ ์ดํดํ๋ค.
๋ณ์ ์ ์ธ ํค์๋(let, const, var)์ ์ค์ฝํ์์ ๊ด๊ณ๋ฅผ ์ค๋ช ํ ์ ์๋ค.
์ ์ญ ๊ฐ์ฒด๊ฐ ๋ฌด์์ธ์ง ์ค๋ช ํ ์ ์๋ค.
์ค์ฝํ๋?
์ค์ฝํ์ ์ ์: ๋ณ์ ์ ๊ทผ ๊ท์น์ ๋ฐ๋ฅธ ์ ํจ ๋ฒ์
๋ฒ์๊ฐ ์ค๊ดํธ(๋ธ๋ก) ๋๋ ํจ์์ ์ํด ๋๋์ด์ง๊ณ , ๊ทธ ๋ฒ์๋ฅผ ์ค์ฝํ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๊ท์น1.
๋ฐ๊นฅ์ชฝ ์ค์ฝํ์์ ์ ์ธํ ๋ณ์๋ ์์ชฝ ์ค์ฝํ์์ ์ฌ์ฉ ๊ฐ๋ฅ
์์ชฝ ์ค์ฝํ์์ ์ ์ธํ ๋ณ์๋ ๋ฐ๊นฅ์ชฝ ์ค์ฝํ์์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ
๊ท์น2.
์ค์ฝํ๋ ์ค์ฒฉ์ด ๊ฐ๋ฅํ๋ค.
๊ท์น3.
๊ฐ์ฅ ๋ฐ๊นฅ์ ์ค์ฝํ๋ ํน๋ณํ ์ ์ญ ์ค์ฝํ (Global scope)๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์์์๋ scope1์ด ์ ์ญ ์ค์ฝํ์ด๋ค.
๋๋จธ์ง๋ ๋ชจ๋ ์ง์ญ ์ค์ฝํ(Local scope)๋ผ๊ณ ํ๋ค. ์์์๋ scope2,3,4๊ฐ ์ง์ญ ์ค์ฝํ์ด๋ค.
๊ท์น4.
์ง์ญ ์ค์ฝํ์์ ์ ์ธํ ๋ณ์๋ ์ง์ญ ๋ณ์, ์ ์ญ ์ค์ฝํ์์ ์ ์ธํ ๋ณ์๋ ์ ์ญ ๋ณ์์ด๋ค.
์ง์ญ ๋ณ์๋ ์ ์ญ ๋ณ์๋ณด๋ค ๋ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ค.
let name = 'Hailie'; // ์ ์ญ ๋ณ์
function showName() {
let name = 'frontendEngineer'; // ์ง์ญ ๋ณ์
}
์์ ๋ก ๊ฐ๋ ์ก๊ธฐ1
let name = 'Hailie'; // ์ ์ญ ๋ณ์
function showName() {
let name = 'frontendEngineer'; // ์ง์ญ ๋ณ์
console.log(name); // ์ถ๋ ฅ์ 'frontendEngineer' ๋ณ์ ์ด๋ฆ์ด ์ ์ญ ๋ณ์์ ๋๊ฐ์ง๋ง, ์ง์ญ ๋ณ์๊ฐ ์ ์ญ ๋ณ์๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ผ๋๊น
}
console.log(name); // ์ถ๋ ฅ์ 'Hailie'
showName();
console.log(name); // ์ถ๋ ฅ์ 'Hailie'
๋์ผํ ๋ณ์ ์ด๋ฆ์ผ๋ก ์ธํด ๋ฐ๊นฅ์ชฝ ๋ณ์๊ฐ ์์ชฝ ๋ณ์์ ์ํด ๊ฐ๋ ค์ง๋(shadow) ํ์์ ์๋์(variable shadowing)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์์ ๋ก ๊ฐ๋ ์ก๊ธฐ2
let name = 'Hailie'; // ์ ์ญ ๋ณ์
function showName() {
name = 'frontendEngineer'; // ์ง์ญ ๋ณ์
console.log(name); // ์ถ๋ ฅ์
}
console.log(name); // ์ถ๋ ฅ์ 'Hailie'
showName();
console.log(name); // ์ถ๋ ฅ์ 'frontendEngineer'
์ธ ๋ฒ์งธ ์ค์์ let ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์ธํ์ง ์์๋ค. ์ด๋, 'frontendEngineer'๋ผ๋ ๊ฐ์ผ๋ก ํ ๋นํ๊ณ ์๋ name ๋ณ์๋ ์ ์ญ์ ์ ์ธ๋ name ๋ณ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๊ฒ ๋ค๋ ์๋ฏธ๋ค!
์ค์ฝํ์ ์ข ๋ฅ
๋ธ๋ก ์ค์ฝํ(block scope) : ์ค๊ดํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฒ์๊ฐ ๊ตฌ๋ถ๋๋ค.
ex) ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ, ํ์ดํ ํจ์(์ ์)
ํจ์ ์ค์ฝํ(function scope)
ex) function ํค์๋๊ฐ ๋ฑ์ฅํ๋ ํจ์ ์ ์ธ์ ๋ฐ ํจ์ ํํ์
let getAge = user => {
return user.age;
} // ๊ฐ์ ํจ์์ฌ๋, ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ธ๋ก ์ค์ฝํ๋ก ์ทจ๊ธ๋๋ค.
let getAge = function (user) {
return user.age;
} // function ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์ ์ค์ฝํ
- let, const ํค์๋๋ ๋ธ๋ก ์ค์ฝํ ๋ฐ๋ฅธ๋ค. ์ถ๊ฐ๊ณต๋ถ
- var ํค์๋๋ก ์ ์ํ ๋ณ์๋ ๋ธ๋ก ์ค์ฝํ๋ฅผ ๋ฌด์ํ๊ณ , ํจ์ ์ค์ฝํ๋ง ๋ฐ๋ฅธ๋ค.๊ทธ๋ฌ๋, ๋ชจ๋ ๋ธ๋ก ์ค์ฝํ๋ฅผ ๋ฌด์ํ๋ ๊ฒ ์๋๋ผ, ํ์ดํ ํจ์์ ๋ธ๋ก ์ค์ฝํ๋ ๋ฌด์ํ์ง ์๋๋ค.
var ํค์๋๋ณด๋ค letํค์๋๋ฅผ ๊ถ์ฅํ๋ ์ด์
1. ๋ธ๋ก ๋จ์๋ก ์ค์ฝํ๋ฅผ ๊ตฌ๋ถํ์ ๋, ํจ์ฌ ๋ ์์ธก์ด ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ผ๋ฏ๋ก, let ํค์๋ ์ฌ์ฉ์ด ๊ถ์ฅ๋๋ค.
2. let ํค์๋๋ ์ฌ์ ์ธ์ ๋ฐฉ์งํ๋ค. (var ํค์๋๋ ์ฌ์ ์ธํด๋ ์๋ฌ๋์ง ์๋๋ค. )
const ํค์๋๋ ์ธ์ ์ธ๊น?
๋ณํ์ง ์๋ ๊ฐ, ๊ณง ์์(constant)๋ฅผ ์ ์ํ ๋์๋ const๋ฅผ ์ด์ฉํ๋ค.
const๋ ๊ฐ์ ์ฌํ ๋น์ด ๋ถ๊ฐ๋ฅํ๋ค. ๊ฐ์ ์ฌํ ๋นํ ๊ฒฝ์ฐ TypeError๋ฅผ ๋ด๋ฏ๋ก, ์๋ํ์ง ์์ ๊ฐ์ ๋ณ๊ฒฝ์ ๋ง์ ์ ์๋ค.
let | const | var | |
์ ํจ ๋ฒ์ | ๋ธ๋ก ์ค์ฝํ ๋ฐ ํจ์ ์ค์ฝํ | ๋ธ๋ก ์ค์ฝํ ๋ฐ ํจ์ ์ค์ฝํ | ํจ์ ์ค์ฝํ & ํ์ดํ ํจ์ |
๊ฐ ์ฌํ ๋น | ๊ฐ๋ฅ | ๋ถ๊ฐ๋ฅ | ๊ฐ๋ฅ |
์ฌ์ ์ธ | ๋ถ๊ฐ๋ฅ | ๋ถ๊ฐ๋ฅ | ๊ฐ๋ฅ |
๋ณ์ ์ฌ์ฉ์ ์ฃผ์์ฌํญ
- ์ ์ญ ๋ณ์ ์ต์ํํ๊ธฐ
์ ์ญ ๋ณ์๊ฐ ํธ๋ฆฌํ ๋์ , ๋ค๋ฅธ ํจ์ ํน์ ๋ก์ง์ ์ํด ์๋๋์ง ์์ ๋ณ๊ฒฝ์ด ๋ฐ์ํ ์ ์๋ค.
2. var๋ก ์ ์ธํ ๋ณ์๋ window ๊ฐ์ฒด์ ์ํ ๋ณ์, ์ฆ ์ ์ญ ๋ณ์๊ฐ ๋๋ค. ๊ทธ๋์ ์ ์ญ ๋ณ์๋ฅผ var๋ก ์ ์ธํ๋ ๊ฒ์ ๋ธ๋ผ์ฐ์ ๋ด์ฅ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ๋ง๋ค ์ ์๋ค. // var๋ก ์ ์ธํ ์ ์ญ ๋ณ์๊ฐ window ๊ธฐ๋ฅ์ ๋ฎ์ด์์์ ๋ด์ฅ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ํ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
(์ถ๊ฐ๊ณต๋ถ)
- Window ๊ฐ์ฒด๋ only ๋ธ๋ผ์ฐ์ ์๋ง ์กด์ฌํ๋ ๊ฐ์ฒด์ด๋ค.
- ๋ธ๋ผ์ฐ์ ์ ์ฐฝ(window)๋ฅผ ์๋ฏธํ๋ ๊ฐ์ฒด์ด๋ค.
- ๊ทธ๋ฐ๋ฐ ๋ณ๊ฐ๋ก ์ ์ญ ์์ญ์ ๋ด๊ณ ์๊ธฐ๋ํ๋ค.
- ๊ทธ๋์ ํจ์ ์ ์ธ์์ผ๋ก ํจ์๋ฅผ ์ ์ธํ๊ฑฐ๋ var ํค์๋๋ก ๋ณ์๋ฅผ ์ ์ธํ๋ฉด window ๊ฐ์ฒด์ ์ํด์ง๋ค.
3. ์ ์ธ ์๋ ๋ณ์ ํ ๋น ๊ธ์ง! // ๊ฐ์ ํ ๋นํ๋ฉด์ ๋ง์น var๋ก ์ ์ธ๋ ์ ์ญ ๋ณ์์ฒ๋ผ ์๋ํ๋ค.
ํ)js ํ์ผ ์๋จ์ 'use strict' ์ ๋ ฅํ๋ฉด ์ค์๋ฐฉ์ง ๊ฐ๋ฅ!
4. ๋ณ์๋ณด๋ค๋ ์์๋ฅผ ์ฌ์ฉํด ๊ฐ์ ๋ณ๊ฒฝ์ ์ต์ ํ์. const
5. ๋ณ์ ์ด๋ฆ์ ๋ณ์์ ๋ชฉ์ ์ด๋ ์๋ฏธ๋ฅผ ํ์ ํ ์ ์๋๋ก ๋ค์ด๋ฐํ์.
๊ฐ๋ ์ฑ ์ข์ ์ฝ๋๊ฐ ์ข์ ์ฝ๋๋ค!
์ปดํจํฐ๊ฐ ์ดํดํ๋ ์ฝ๋๋ ์ด๋ค ๋ฐ๋ณด๋ ์ธ ์ ์๋ค. ํ์ง๋ง ํ๋ฅญํ ํ๋ก๊ทธ๋๋จธ๋ ์ฌ๋์ด ์ดํดํ ์ ์๋ ์ฝ๋๋ฅผ ์ด๋ค.
by. Martin Fowler <๋ฆฌํฉํ ๋ง>์ ์ ์
'๐Language > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฌธ์ ๋ก ๊ฐ๋ ์ก๋ ์ค์ฝํ (0) | 2022.05.14 |
---|---|
TIL) ์๋ฐ์คํฌ๋ฆฝํธ ํด๋ก์ ๊ฐ๋ ๊ณผ ํน์ง (0) | 2022.05.14 |
TIL) ์์ ์๋ฃํ๊ณผ ์ฐธ์กฐ ์๋ฃํ, ์ฐจ์ด์ , reference๋? (0) | 2022.05.12 |
TIL) ๊ฐ์ฒด, object ๊ธฐ๋ณธ ๊ฐ๋ ์ฌ์ด ์ค๋ช , ์๋ฐ์คํฌ๋ฆฝํธ (0) | 2022.05.12 |
TIL) ์๋ฐ์คํฌ๋ฆฝํธ splice ์ slice ์ฐจ์ด ์ฌ์ด ์ค๋ช (0) | 2022.05.10 |