๐ญ ์ค์ฝํ๋?
- ๋จ์ด ์์ฒด์ ์ฌ์ ์ ์๋ฏธ๋ก๋ '๋ฒ์' ๋ผ๋ ๋ป์ ๊ฐ์ง๋ค.
- CS, ๊ทธ๋ฆฌ๊ณ JavaScript์์๋ '๋ฒ์' ๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ๋๋ค.
- ์ข ๋ ๊ตฌ์ฒด์ ์ธ ๋ป์ '์ฐธ์กฐ ๋์ ์๋ณ์( identifier, ๋ณ์, ํจ์์ ์ด๋ฆ๊ณผ ๊ฐ์ด ์ด๋ค ๋์์ ๋ค๋ฅธ ๋์๊ณผ ๊ตฌ๋ถํด ์๋ณํ ์ ์๋ ์ ์ผํ ์ด๋ฆ )๋ฅผ ์ฐพ์๋ด๊ธฐ ์ํ ๊ท์น' ์ ๋ปํ๋ค.
// ์์ ์ฝ๋
const x = 'global';
function foo () {
const x = 'function scope';
console.log(x);
}
foo(); // ?
console.log(x); // ?
- ์ ์์ ์์ ๋ณด๋ฉด ๋ณ์ x๊ฐ ์ค๋ณต ์ ์ธ๋๋๋ฐ, ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ค์ฝํ๋ฅผ ํตํด ์ ์ญ์ ์ ์ธ๋ ๋ณ์ x์ ํจ์ foo ๋ด๋ถ์ ๋ณ์ x๋ฅผ ๊ตฌ๋ถํ ์ ์๋ค.
- ์ค์ฝํ๋ฅผ ๊ตฌ๋ถํด๋ณด์๋ฉด ๋ค์๊ณผ ๊ฐ์ด 2๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
์ ์ญ ์ค์ฝํ (Global Scope)
์ฝ๋ ์ด๋์์๋ ์ง ์ฐธ์กฐํ ์ ์๋ค.
์ง์ญ ์ค์ฝํ (Local Scope or Funtion-level Scope)
ํจ์ ์ฝ๋ ๋ธ๋ก์ด ๋ง๋ ์ค์ฝํ๋ก ํจ์ ์์ ๊ณผ ํ์ ํจ์์์๋ง ์ฐธ์กฐํ ์ ์๋ค.
- ๋ชจ๋ ๋ณ์๋ ์ค์ฝํ๋ฅผ ๊ฐ๋๋ค. ๋ณ์์ ๊ด์ ์์ ์ค์ฝํ๋ฅผ ๊ตฌ๋ถํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋๋ ์ ์๋ค.
์ ์ญ ๋ณ์ (Global variable)
์ ์ญ์์ ์ ์ธ๋ ๋ณ์์ด๋ฉฐ ์ด๋์๋ ์ฐธ์กฐํ ์ ์๋ค.
์ง์ญ ๋ณ์ (Local variable)
์ง์ญ(ํจ์) ๋ด์์ ์ ์ธ๋ ๋ณ์์ด๋ฉฐ ๊ทธ ์ง์ญ๊ณผ ๊ทธ ์ง์ญ์ ํ๋ถ ์ง์ญ์์๋ง ์ฐธ์กฐํ ์ ์๋ค.
๐ก ์๋ฐ์คํฌ๋ฆฝํธ ์ค์ฝํ์ ํน์ง
- ์๋ฐ์คํฌ๋ฆฝํธ ์ค์ฝํ๋ ํ ์ธ์ด์๋ ๋ค๋ฅธ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
- ๋๋ถ๋ถ์ C ๊ณ์ด ์ธ์ด๋ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ(block-level scope)๋ฅผ ๋ฐ๋ฅธ๋ค. ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ ์ฝ๋ ๋ธ๋ก({...}) ๋ด์์ ์ ํจํ ์ค์ฝํ๋ฅผ ์๋ฏธํ๋ค. ์ฌ๊ธฐ์ '์ ํจํ๋ค'๋ '์ฐธ์กฐ(์ ๊ทผ)ํ ์ ์๋ค' ๋ ๋ป์ด๋ค.
int main(void) {
// block level scope
if (1) {
int x = 5;
printf("x = %d\n", x);
}
printf("x = %d\n", x); // use of undeclared identifier 'x'
return 0;
}
- ์ C์ธ์ด ์ฝ๋๋ฅผ ๋ณด๋ฉด if๋ฌธ ๋ด์ ์ ์ธ๋ ๋ณ์ x๋ if๋ฌธ ์ฝ๋ ๋ธ๋ก ๋ด์์๋ง ์ ํจํ๋ค. ์ฆ, if๋ฌธ ๋ฐ๊นฅ์์๋ ์ฐธ์กฐ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
- ํ์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ๋ ํจ์ ๋ ๋ฒจ ์ค์ฝํ(function-level scope)๋ฅผ ๋ฐ๋ฅธ๋ค. ์ฆ ํจ์ ๋ด์์ ์ ์ธ๋ ๋ณ์๋ ํจ์ ๋ด์์ ์ ํจํ๋ค๋ ๋ป์ด๋ค.
- ๋จ, ES6์์ ๋์ ๋ let์ ์ฌ์ฉํ๋ฉด ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์์ 1
var x = 0;
{
var x = 1;
console.log(x); // 1
}
console.log(x); // 1
let y = 0;
{
let y = 1;
console.log(y); // 1
}
console.log(y); // 0
์์ 2
// var์ ๋น ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ์ด๋ค.
if (true) {
var x = 5;
}
console.log(x); // 5
// let์ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ์ด๋ค.
if (true) {
let x = 5;
}
console.log(x); // ReferenceError: x is not defined
์์ 3
// ํจ์(์ง์ญ) ์์ญ์์ ์ ์ญ๋ณ์๋ฅผ ์ฐธ์กฐํ ์ ์์ผ๋ฏ๋ก ์ ์ญ ๋ณ์์ ๊ฐ๋ ๋ณ๊ฒฝํ ์ ์๋ค.
var x = 10;
function foo() {
x = 100;
console.log(x); // 100
}
foo();
console.log(x); // 100
๐ ์ค์ฝํ์ ์ฃผ์ ๊ท์น
- ์์ชฝ ์ค์ฝํ์์ ๋ฐ๊นฅ์ชฝ ์ค์ฝํ๋ก ์ ๊ทผํ ์ ์์ง๋ง ๋ฐ๋๋ ๋ถ๊ฐ๋ฅํ๋ค.
- ์ง์ญ ๋ณ์๋ ์ ์ญ ๋ณ์๋ณด๋ค ์ฐ์ ์์๊ฐ ๋ ๋๋ค.
- ์ค์ฝํ๋ ์ค์ฒฉ์ด ๊ฐ๋ฅํ๋ค.
์ง์ญ ๋ณ์ ์ฐ์ ์์ ์
var x = 'global';
function foo() {
var x = 'local';
console.log(x); // local
function bar() {
console.log(x); // local
}
bar();
}
foo();
console.log(x); // global
์ค์ฒฉ ์ค์ฝํ ์
var x = 10;
function foo(){
var x = 100;
console.log(x); // 100
function bar(){
x = 1000;
console.log(x); // 1000
}
bar();
}
foo();
console.log(x); // 10
// ์ค์ฒฉ ์ค์ฝํ๋ ๊ฐ์ฅ ์ธ์ ํ ์ง์ญ์ ์ฐ์ ํด ์ฐธ์กฐํ๋ค.
๐ ์ค์ฝํ์ var, let, const
- ์๋ฐ์คํฌ๋ฆฝํธ ๋ณ์ ์ ์ธ ํค์๋ ์ธ๊ฐ์ง์ ์ฐจ์ด์ ๋ฐ ์ค์ฝํ ์ ํจ ๋ฒ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
const | let | var | |
์ ํจ ๋ฒ์ | ๋ธ๋ก ์ค์ฝํ / ํจ์ ์ค์ฝํ | ๋ธ๋ก ์ค์ฝํ / ํจ์ ์ค์ฝํ | ํจ์ ์ค์ฝํ |
๊ฐ ์ฌํ ๋น | ๋ถ๊ฐ๋ฅ | ๊ฐ๋ฅ | ๊ฐ๋ฅ |
์ฌ์ ์ธ | ๋ถ๊ฐ๋ฅ | ๋ถ๊ฐ๋ฅ | ๊ฐ๋ฅ |
์ ์ญ ์ค์ฝํ | x | x | o |
- ์ฌ๊ธฐ์ ์ฃผ๋ชฉํด์ผํ ์ ์ var์ ์ ํจ ๋ฒ์์ ์ ์ญ ์ค์ฝํ ์ฌ๋ถ์ธ๋ฐ ๊ทธ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
for (var i = 0; i < 10; i++) {
console.log(i);
}
console.log(i); // 9
// for๋ฌธ์์ ์ ์ธ๋ i ๋ณ์์ง๋ง ๋ชจ๋ ์ค์ฝํ์์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
๐ท ์ค์ฝํ ๊ด๋ จ ๋ณ์ ์ ์ธ์ ์ฃผ์์
โ๏ธ ์ ์ญ ๊ฐ์ฒด(window)์ ์ดํด
- Window ๊ฐ์ฒด๋ ๋ธ๋ผ์ฐ์ ์์๋ง ์กด์ฌํ๋ ๊ฐ์ฒด๋ค.
- ๋ธ๋ผ์ฐ์ ์ ์ฐฝ(window)์ ์๋ฏธํ๋ ๊ฐ์ฒด์ด๋ค.
- ํ์ง๋ง ๋ณ๊ฐ๋ก ์ ์ญ ์์ญ์ ๋ด๊ณ ์๊ธฐ๋ ํ๋ค. ๊ทธ๋์ ํจ์ ์ ์ธ์์ผ๋ก ํจ์๋ฅผ ์ ์ธํ๊ฑฐ๋, var ํค์๋๋ก ๋ณ์๋ฅผ ์ ์ธํ๋ฉด window ๊ฐ์ฒด์ ์ํด์ง๋ค.
โ๏ธ ์ ์ญ ๋ณ์๋ ์ต์ํํ์
- ์ ์ญ ๋ณ์๋ ์ด๋์๋ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค๋ ํน์ง์ด ์๋ค.
- ์ ์ญ ๋ณ์๋ฅผ ์ต์ํํด์ผ side effect(์๋ํ์ง ์์ ๋ก์ง์ ์ํ ๋ฌธ์ ๋ฐ์)๋ฅผ ์ค์ผ ์ ์๋ค.
โ๏ธ ์ ์ธ ์๋ ๋ณ์ ํ ๋น ๊ธ์ง
- let, const ๋ฑ์ผ๋ก ์ ์ธํ์ง ์๊ณ ๋ณ์๋ฅผ ํ ๋นํ๋ฉด ํด๋น ๋ณ์๋ var๋ก ์ ์ธํ ์ ์ญ ๋ณ์ ์ทจ๊ธ์ ํ๋ค.
- ์ค์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ Strict Mode๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
- Strict Mode๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ณด๋ค ์๊ฒฉํ๊ฒ ์๋ํ๋๋ก ๋ง๋ค์ด์ค๋ค.
- ๊ทธ๋์ ์ ์ธ ์๋ ๋ณ์ ํ ๋น์ ๊ฒฝ์ฐ๋ ์๋ฌ๋ก ํ๋จํด์ค๋ค.
- ๋ณดํต ๋ฆฌ์กํธ๋ index ํ์ผ์ Strict Mode๊ฐ ์ ์ฉ๋ผ์์ง๋ง, ๊ทธ๋ฅ JS๋ก ํ๋ก์ ํธ๋ฅผ ๋ง๋๋ ค๋ฉด js ํ์ผ ์๋จ์ 'use strict'๋ฅผ ์ ๋ ฅํด์ฃผ๋ฉด ๋๋ค.
๋ฐ์ํ
'Programming > 4. JavaScript & React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
010_for, forEach, map(์ฌ์ ๋ฆฌ ver.) ๐ (0) | 2022.03.14 |
---|---|
009_์๋ฐ์คํฌ๋ฆฝํธ, ์ฑ๊ธ ์ฐ๋ ๋, ๋น๋๊ธฐ, ๋ ผ๋ธ๋กํน, ์ด๋ฒคํธ ๋ฃจํ (0) | 2022.03.14 |
007_TDD, ๊ทธ๋ฆฌ๊ณ Storybook (0) | 2022.02.14 |
006_์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธ ์ฑ๋ฆฐ์ง_3 (0) | 2022.02.02 |
005_์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธ ์ฑ๋ฆฐ์ง_2 (0) | 2022.01.26 |
๋๊ธ