์ค์ฝํ
๋ ์ฐธ์กฐ ๋์ ์๋ณ์ (identifier, ๋ณ์, ํจ์์ ์ด๋ฆ๊ณผ ๊ฐ์ด ์ด๋ค ๋์์ ๋ค๋ฅธ ๋์๊ณผ ๊ตฌ๋ถํ์ฌ ์๋ณํ ์ ์๋ ์ ์ผํ ์ด๋ฆ) ๋ฅผ ์ฐพ์๋ด๊ธฐ ์ํ ๊ท์น์ด๋ค.
์๋ณ์๋ ์์ ์ด ์ด๋์์ ์ ์ธ๋๋์ง์ ์ํด ๋ค๋ฅธ ์ฝ๋๊ฐ ์์ ์ ์ฐธ์กฐํ ์ ์๋ ๋ฒ์๋ฅผ ๊ฐ๋๋ค. ์ด๋ฌํ ๋ฒ์๋ฅผ
์ค์ฝํ
๋ผ๊ณ ํ๋ค.
์ค์ฝํ๋ ๊ณ์ธต์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์
ํ์ ์ค์ฝํ
๋
์์ ์ค์ฝํ
์ ์ ๊ทผํ ์ ์์ง๋ง ๋ฐ๋๋ ๋ถ๊ฐํ๋ค.
let name = 'me'; //์ ์ญ ์ค์ฝํ์ ํ ๋น๋ name์ ๊ฐ์ 'me'
function yourName(){ //ํจ์ ์ค์ฝํ์ ํ ๋น๋ name์ ๊ฐ์ 'you'
name = 'you';
// name์ ํ ๋น๋ ๊ฐ 'you'๋ ์ค์ง exampleFunction ๋ด๋ถ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ.
}
์์ ์์ ์ ๊ฐ์ด ์ ์ญ์ ์ ์ธ๋ ๋ณ์ name๋ ์ด๋์๋ ์ฐธ์กฐํ ์ ์๋ค.
ํ์ง๋ง ํจ์ yourName ๋ด์์ ์ ์ธ๋ name์ ๊ฐ me๋
ํจ์ yourName ๋ด๋ถ์์๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ฉฐ, ์ธ๋ถ ์ค์ฝํ์์๋
name์ ๊ฐ you๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ค์ฝํ์ ๋ฒ์์๋ ํฌ๊ฒ ์ ์ญ ์ค์ฝํ์ ์ง์ญ์ค์ฝํ๋ก ๋๋๋ค.
์ ์ญ ์ค์ฝํ (Global scope)
- ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ์ ์ค์ฝํ๋ ์ ์ญ ์ค์ฝํ(Global Scope)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์ ์ญ ์ค์ฝํ์์ ์ ์ธํ ๋ณ์๋ ์ ์ญ ๋ณ์(Global variable)
๋ผ๊ณ ๋ถ๋ฅธ๋ค.- ์ ์ญ ๋ณ์๋ ์ด๋์์๋ ์ง ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ๋ค.
์ง์ญ ์ค์ฝํ (Local scope or Function-level scope)
- ์ ์ญ์ด ์๋ ๋ค๋ฅธ ์ค์ฝํ๋ ์ ๋ถ ์ง์ญ ์ค์ฝํ(local scope)์ ํด๋นํ๋ค. (์ง์ญ ์ค์ฝํ๋ ์ค์ฒฉ์ด ๊ฐ๋ฅํ๋ค.)
- ์ง์ญ ์ค์ฝํ์์ ์ ์ธํ ๋ณ์๋ ์ง์ญ ๋ณ์(Local variable)
๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ ์ญ๊ณผ ์ง์ญ ๋ณ์์์ ๋ณ์๋ช ์ด ์ค๋ณต๋ ๊ฒฝ์ฐ,
์ง์ญ๋ณ์
๋ฅผ ์ฐ์ ํ์ฌ ์ฐธ์กฐํ๋ค.
var x = 'global';
function foo() {
var x = 'local';
console.log(x); //local
function bar() { // ๋ด๋ถํจ์
console.log(x); // local
}
bar();
}
foo();
console.log(x); // global
์ ์์ ๋ ์ ์ญ ๋ณ์ x๋ฅผ ์ ์ธ ํ global ๊ฐ์ ํ ๋นํ๊ณ , foo ํจ์์ ๋ด๋ถ์์๋ var x๋ฅผ ์ ์ธ ํ ๊ฐ local์ ํ ๋นํ์๋ค.
foo ํจ์ ๋ด๋ถ์ ์ ์ธ๋ ๋ณ์ x์ local ๊ฐ์ ํจ์ ๋ด๋ถ ์ค์ฝํ์์๋ง ๋ฒ์๊ฐ ์ ์ฉ๋๋ฏ๋ก ๋ง์ง๋ง ์ฝ์ ์ถ๋ ฅ์๋ ์ ์ญ var x ๊ฐ์ธ global์ด ์ถ๋ ฅ๋๋ค.
์ค์ฝํ์๋ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ์ ํจ์ ๋ ๋ฒจ ์ค์ฝํ ๋ ๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค.
๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ(block scope)
- ์ค๊ดํธ ({...}) ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฒ์๋ฅผ ๊ตฌ๋ถํ๋ค.
- ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ ์ฝ๋ ๋ธ๋ก({โฆ})๋ด์์ ์ ํจํ ์ค์ฝํ๋ฅผ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ ๋ธ๋ก ๋ด์์๋ง ๋ณ์๊ฐ ์ ํจํ๋ฉฐ, ๋ธ๋ก ์ธ๋ถ์์๋ ์ ํจํ์ง ์๋ค(์ฐธ์กฐํ ์ ์๋ค)๋ ๊ฒ์ด๋ค.
- ๋จ, ํ์ดํ ํจ์์ ๊ฒฝ์ฐ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ก ์ทจ๊ธํ๋ค.
ํจ์ ๋ ๋ฒจ ์ค์ฝํ(function scope)
- function ํค์๋๊ฐ ๋ฑ์ฅํ๋ ํจ์ ์ ์ธ์ ๋ฐ ํํ์์ ๊ธฐ์ค์ผ๋ก
ํจ์ ์ค์ฝํ๋ฅผ ๋ง๋ ๋ค.- ํจ์ ์ฝ๋ ๋ธ๋ก ๋ด์์ ์ ์ธ๋ ๋ณ์๋ ํจ์ ์ฝ๋ ๋ธ๋ก ๋ด์์๋ง ์ ํจํ๊ณ ํจ์ ์ธ๋ถ์์๋ ์ ํจํ์ง ์๋ค(์ฐธ์กฐํ ์ ์๋ค)๋ ๊ฒ์ด๋ค.
๋ค๋ฅธ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ ์ธ์ด์ ๋ฌ๋ฆฌ,์๋ฐ์คํฌ๋ฆฝํธ๋ ํจ์ ๋ ๋ฒจ ์ค์ฝํ ์ธ์ด์ด๋ค. ํจ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ง์ญ ์ค์ฝํ๊ฐ ์์ฑ๋๋ฉฐ, ํจ์ ๋ด์์ ์ง์ญ ๋ณ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
var x = 0;
{
var x = 1;
console.log(x); // 1
}
console.log(x); // 1
// var ํค์๋๋ก ์ ์ธํ x์ ๊ฐ์ด 0์์ 1๋ก ๋ฐ๋์๋ค.
let y = 0;
{
let y = 1;
console.log(y); // 1
}
console.log(y); // 0
//let ํค์๋๋ก ์ ์ธํ x๊ฐ์ ๋ธ๋ก ์ค์ฝํ ๋ด์์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์๋ let
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์๋ let
const
ํค์๋์ ์ฌ์ฉ์ ๊ถ์ฅํ๋ค.
์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํธ์ด์คํ ๊ณผ ๊ด๋ จ์ด ์๋ค.
let
ํค์๋์ ํน์ง
- ๋ธ๋ก ์ค์ฝํ ์์์
let
ํค์๋๋ก ์ ์๋ ๋ณ์๋
๋ธ๋ก ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์ฆ์ ์ ๊ทผํ ์ ์๋ค.(Reference Error ๋ฐ์)let
์var
์ ๋ฌ๋ฆฌ ์ฌ์ ์ธ์ ๋ฐฉ์งํ๋ค.
var
ํค์๋์ ํน์ง
var
๋ ๋ธ๋ก ์ค์ฝํ๋ฅผ ๋ฌด์ํ ์ ์์ผ๋ฉฐ, ํจ์ ์ค์ฝํ๋ง ๋ฐ๋ฅธ๋ค.var
ํค์๋๋ก ์ ์ธ๋ ๋ณ์๋ ํจ์ ์ค์ฝํ์ ์ต์๋จ์ ์ ์ธ๋๋ค.var
ํค์๋๋let
๊ณผ ๋ฌ๋ฆฌ ์ฌ์ ์ธ์ ํ์ฉํ๋ค.
(๋ณดํต ์ฌ์ ์ธ์ ํด์ผํ๋ ๊ฒฝ์ฐ๋ ๋ฒ๊ทธ์ด๋ฏ๋กlet
ํค์๋๋ฅผ ์ฌ์ฉํ์.)
const
ํค์๋์ ํน์ง
- ๋ณํ์ง ์๋ ๊ฐ, ์์(constant)๋ฅผ ์ ์ํ ๋๋
const
๋ฅผ ์ด์ฉํ๋ค.const
๋ ๊ฐ์ ์ฌํ ๋น์ด ๋ถ๊ฐ๋ฅํ๋ค.
( const ํค์๋ ๋ณ์์ ๊ฐ์ ์ฌํ ๋นํ ๊ฒฝ์ฐ TypeError๋ฅผ ๋ฐ์์ํค๋ฏ๋ก, ์๋ํ์ง ์์ ๊ฐ์ ๋ณ๊ฒฝ์ ๋ง์์ค๋ค. ๋ฐ๋ผ์ ๊ฐ์ ์๋กญ๊ฒ ํ ๋นํ ์ผ์ด ์๋ ๊ฒฝ์ฐ const ํค์๋ ์ฌ์ฉ์ ๊ถ์ฅํ๋ค. )let
ํค์๋์ ๋์ผํ๊ฒ ๋ธ๋ก ์ค์ฝํ๋ฅผ ๋ฐ๋ฅธ๋ค.
window
๊ฐ์ฒด๋ ๋ธ๋ผ์ฐ์ ์๋ง ์กด์ฌํ๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ ์ ์ฐฝ์ ์๋ฏธํ๋ ๊ฐ์ฒด์ง๋ง, ๋ณ๊ฐ๋ก์ ์ญ ์์ญ
์ ๋ด๊ณ ์๊ธฐ๋ ํ๋ค.๋ฐ๋ผ์ ํจ์๋ฅผ ์ ์ธํ๊ฑฐ๋,
var
๋ก ์ ์ญ ๋ณ์๋ฅผ ๋ง๋ค๋ฉดwindow
๊ฐ์ฒด์์๋ ๋์ผํ ๊ฐ์ ์ฐพ์ ์๊ฐ ์๋ค.
์ ์ญ ๋ณ์
๋ ์ด๋์๋ ์ ๊ทผ ๊ฐ๋ฅํ ๋ณ์๋ฅผ ์๋ฏธํ๋ค.์ฐธ์กฐ๊ฐ ์ฌ์์ ํธ๋ฆฌํ ๋์ ๋ค๋ฅธ ํจ์ ํน์ ๋ก์ง์ ์ํด ์๋๋์ง ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋
side effect
๊ฐ ๋ฐ์ํ ์ ์๋ค.
๊ฐ์ ์ค์ฝํ์์ ๋์ผํ ์ด๋ฆ์ ๋ณ์๋ฅผ ์ฌ์ ์ธ ํ๋ ๊ฒ์ ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ๋ค.
var๋ก ์ ์ธํ ์ ์ญ ๋ณ์๋ window ๊ฐ์ฒด์ ์ํ๋ ์ ์ญ๋ณ์๊ฐ ๋๋ค.
์ด๋ window ๊ธฐ๋ฅ์ ๋ฎ์ด์์์ ๋ด์ฅ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ค ์ ์๋ค.
์๋ฌด๋ฐ ํค์๋ ์ ์ธ ์์ด ๋ณ์๋ฅผ ํ ๋นํ๋ฉด var๋ก ์ ์ธํ
์ ์ญ ๋ณ์
์ฒ๋ผ ์ทจ๊ธ๋๋ค.
Strict Mode
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์๊ฒฉํ๊ฒ ์๋๋๋ค. ์ ์ธ ์๋ ๋ณ์ํ ๋น์ ๊ฒฝ์ฐ๋ Strict Mode์์๋ ์๋ฌ๋ก ํ๋จํ๋ค.Strict Mode์ ์ฌ์ฉ : js ํ์ผ ์๋จ์
'use strict';
์ ๋ ฅ
ํจ์๋ ๋ณ์๊ฐ ์ ํจํ ๋ฒ์๋ฅผ ๊ฐ์ง๋๋ฐ, ๊ทธ๊ฒ์ ์ค์ฝํ ๋ผ๊ณ ํ๋ค.
์ค์ฝํ๋ ์ง์ญ ์ค์ฝํ์์ ์ธ๋ถ ์ค์ฝํ๋ก์ ์ฐธ์กฐ๋ ๊ฐ๋ฅํ๋,
๋ฐ๋๋ก ์ธ๋ถ ์ค์ฝํ์ ์ ์ง์ญ ์ค์ฝํ๋ก์ ์ฐธ์กฐ๋ ๋ถ๊ฐ๋ฅํ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ํจ์ ๋ ๋ฒจ ์ค์ฝํ ์ธ์ด๋ผ์ ํจ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค์ฝํ ๊ฐ์ ๊ฐ๋๋ค.
ํ์ง๋ง let, const ํค์๋๋ฅด ์ฌ์ฉํ๋ฉด ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.