์ค๋์ ์ด์ ๋ฐฐ์ ๋ JS ๊ธฐ์ด ์ง์์ ๋ณต์ต ํ ํ ํด๋ก์ ์ ๋ํด ์์๋ณด๊ฒ ๋ค!!
๋ผ๊ณ ์๊ฐํ๊ณ ํธ๊ธฐ๋กญ๊ฒ ๊ณต๋ถ๋ฅผ ์์ํ์ง๋ง ํด๋ก์ ๋ฅผ ์๊ธฐ์ํด ์์์ผํ ์ง์๋ค์ด ๋น์ด์๋ค๋ ๊ฑธ ์๊ฒ๋๋ค,,๐
์คํ๋ ค ์ข๋ค!! ๋ด๊ฐ ๋ชฐ๋๋ ๋ถ๋ถ์ ๊ณ์ํด์ ์ฐ๊ฒฐ๋์ด ์๊ฒ๋๋ ๊ฒ์ด๋ ์์ฃผ ์ข์ ์ฒด์ด๋..์ด๋ผ๊ณ ์๊ฐํด์ผ๊ฒ ๋ค.
๋จผ์ ํด๋ก์ ๋ฅผ ์ดํดํ๊ธฐ ์ํด ์ปจํ ์คํธ๋ฅผ ์ดํดํด์ผํ๊ณ ์ปจํ ์คํธ๋ฅผ ์ดํดํ๊ธฐ์ํด ์ค์ฝํ๋ฅผ ์ดํดํด์ผํ๊ณ ์ค์ฝํ๋ฅผ ์ดํดํ๊ธฐ ์ํด ์ ์ญ๋ณ์์ ์ง์ญ๋ณ์๋ฅผ ์ดํดํด์ผํ๋ค.
์ค๋์ ํ์ต ์์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด๋ค.
์ ์ญ๋ณ์์ ์ง์ญ๋ณ์ => ์ค์ฝํ => ์ปจํ ์คํธ => ํด๋ก์
์ดํ ๋ด์ฉ์ ๊ณต๋ถํ๋ฉด์ ๋ง์ ๋์์ ์ค ๋ธ๋ก๊ทธ๊ฐ ์๋ค.
๋์์ ๋ฐ์ ์ ๋ก์ด๋ ๋ธ๋ก๊ทธ
๋ณ์๋ ์ ํจ๋ฒ์์ ๋ฐ๋ผ ์ ์ญ๋ณ์์ ์ง์ญ๋ณ์๋ก ๋๋์ด์ง๋ค!!
์ฝ๊ฒ ๋งํด ํจ์ ์์ ์๋ ๋ณ์๋ ์ง์ญ๋ณ์
ํจ์ ๋ฐ๊นฅ์ ์๋ ๋ณ์๋ ์ ์ญ๋ณ์์ด๋ค.
IN ํจ์ => ์ง์ญ๋ณ์
OUT ํจ์ => ์ ์ญ๋ณ์
let x = "global"
function ex(){
let x = local
x = changed
}
ex()
console.log(x)
์ ํจ์๋ฅผ ์คํ์ํค๋ฉด ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋์ฌ๊น?
์ ๋ต์ .. global!!
์๋ํ๋ฉด ์ ์ญ๋ณ์๋ก ์ ์ธ๋ 1line์ x์ function ์์ ์กด์ฌํ๋ x๋ ์ ํ ๋ค๋ฅธ ๋ณ์์ด๋ค.
๋ณ์๋ ์ ์ธ ์์ ์์ ์ค์ฝํ๊ฐ ์ ํด์ง๋๋ฐ ์ด๋ ์กฐ๊ธ ์ด๋ฐ ์ ๋ฆฌ๋ฅผ ํ ๊ฒ์ด๋ค.
๋ง์ฝ changed๋ฅผ console ํ๊ณ ์ถ๋ค๋ฉด
exํจ์๋ x๋ฅผ ๋ฆฌํดํ๋ฉด ์ธ๋ถ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค!!
์ง๊ธ ์์๋์ด์ผ ํ ๊ฒ์ ํจ์ ๋ด๋ถ์ ์๋ค๋ฉด "์ง์ญ๋ณ์"
ํจ์ ์ธ๋ถ์ ์๋ค๋ฉด "์ ์ญ๋ณ์"
์ค์ฝํ๋ ๋ณ์์ ์ฌ์ฉ ๋ฒ์๋ผ๊ณ ๋ณด๋ฉด๋๋ค!!
๋ณ์๋ ์ด๋์ ์ ์ธ๋๋๋์ ๋ฐ๋ผ ๊ทธ ์ฌ์ฉ ๋ฒ์๊ฐ ๊ฒฐ์ ์ด ๋๋ค..โญ๏ธ
๊ทธ๋ ๋ค๋ฉด ๊ทธ ๋ฒ์๋ ์ด๋ป๊ฒ ์ค์ ๋ ๊น?
๊ฒฐ๊ณผ์ ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ ์ญ๋ณ์๋ ์ง์ญ๋ณ์์ ์ ๊ทผํ ์โ
์ง์ญ๋ณ์๋ ์ ์ญ๋ณ์์ ์ ๊ทผํ ์โญ๏ธ
๋ด๋ถ์์ ์ธ๋ถ๋ ์ ๊ทผ์ด ๊ฐ๋ฅํ์ง๋ง, ์ธ๋ถ์์ ๋ด๋ถ๋ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค.
let x = "global"
function ex(){
let x = local
x = changed
}
ex()
console.log(x)
์์ ๊ฐ์ ์ฝ๋๋ฅผ ๋ดค์ ๋ ๋ด๋ถ์ x ๋ณ์๋ ์ธ๋ถ x์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค ๋ง์ฝ
let x = "global"
function ex(){
console.log(x)
}
ex()
์ด๋ฐ ์ฝ๋๊ฐ ์์๋ค๋ฉด ๊ฒฐ๊ณผ๋ global์ ์ถ๋ ฅํ๋ค.
๋ด๋ถ ํจ์์์ ์ ์ญ๋ณ์์ธ x๋ฅผ ์ฐธ์กฐํ์ฌ console.log(x)๋ฅผ ์ถ๋ ฅํ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ๋ถ๊ฐ๋ฅํ๋ค.
let x = "haha"
function A(){
let y = "hoho"
}
console.log(y)
์ ํจ์์์๋ undefined๊ฐ ์ฐํ๋ค
์๋ํ๋ฉด ๋ด๋ถ์ y ์ง์ญ๋ณ์๋ ์ธ๋ถ์์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ ์ ์ญ๋ณ์์ ์ง์ญ๋ณ์์ ๊ด๊ณ์์ ์ค์ฝํ ์ฒด์ธ์ด๋ผ๋ ๊ฐ๋ ์ด ๋ฐ์ํ๋ค.
๋ด๋ถํจ์๋ ์ธ๋ถํจ์์ ๋ณ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ์ง๋ง ์ธ๋ถํจ์๋ ๋ด๋ถํจ์์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค. ๋ด๋ถํจ์๋ ์ญํ ์ด ๋๋๋ฉด ์์ ๋ณ์๋ ์ข ๋ฃ๋๋ค.
var name = 'zero'; // 1.์ ์ธ 2.ํ ๋น
// name ์ฐพ์๋ค!!
function outer() {//3.์ ์ธ 4.ํ ๋น
console.log('์ธ๋ถ', name); // 12. ์คํ => name์ด ์ด๋จ์ง?
function inner() {//5.์ ์ธ 6.ํ ๋น
var enemy = 'nero'; // 9. ์ ์ธ 10.ํ ๋น
console.log('๋ด๋ถ', name); // 11. ์คํ => name์ด ์ด๋จ์ง?
}
inner();// 8 ์คํ
}
outer();//7 ์คํ
console.log(enemy); // 13. ์คํ undefined
//์ธ๋ถ์์ ๋ด๋ถ ๋ณ์ (์ง์ญ๋ณ์)์ ์ ๊ทผ ํ ์ ์๊ธฐ ๋๋ฌธ!!
์ ์ฃผ์์ ๋ฌ์๋์ ๋ด์ฉ ์ฒ๋ผ ๋ด๋ถscope์์ ์ธ๋ถscope๋ก ๋ณ์๋ฅผ ์ฐพ์๋ด๋ ๊ณผ์
์ฆ, ๊ผฌ๋ฆฌ์ ๊ผฌ๋ฆฌ๋ฅผ ๋ฌผ๊ณ ๋ฒ์๋ฅผ ๋ํ๋ฉด์ ์ฐพ์๋ด๋ ๊ด๊ณ๋ฅผ ์ค์ฝํ์ฒด์ธ์ด๋ผ๊ณ ํ๋ค!!
๋ด๋ถ scope ์์ ์ธ๋ถ scope๋ก ๋ณ์๋ฅผ ์ฐพ์ ๋์๋ ๊ด๊ณ๋ฅผ ์ค์ฝํ ์ฒด์ธ!!
๋จผ์ ์ค์ฝํ๋ ํจ์๋ฅผ ํธ์ถํ ๋๊ฐ ์๋๋ผ ์ ์ธํ ๋ ์์ฑ๋๋ค!๋ฅผ ์๊ณ ์์ด์ผ ํ๋ค.
var name = 'zero';
function log() {
console.log(name);
}// ์ด๋ ์์ฑ์์ ์์ name์ ์ ์ญ๋ณ์์ธ name์ ๊ฐ๋ฅดํจ๋ค!
//
function wrapper() {
name = 'nero';// ๊ทผ๋ฐ ๊ทธ ์ ์ญ๋ณ์๋ฅผ ๊ต์ฒด
log();// ๊ทธ๋ ๊ฒ nero๊ฐ ์ถ๋ ฅ!
}
wrapper();//์ฌ๊ธด ์คํ์์ !
var name = 'zero';
function log() {
console.log(name);// ์ด๋ ์ ์ญ๋ณ์๋ฅผ ๊ฐ๋ฅดํจ๋ค "zero"
}
function wrapper() {
var name = 'nero';
log();//์ฌ๊ธฐ๋ ์คํ์์ ์ด๋ผ ์ด๋ ์ค์ฝํ๊ฐ ์์ฑ๋๋ ๊ฒ์ด ์๋๋ค!
//๊ทธ๋๊น name์ ์ํฅ์ wrapper์ ์๋ ๊ฒ์ด ์๋๋ผ ์์ฑ์์ ์ธ
//log์์ ์ด๋ฏธ ์ ์ญ๋ณ์ name์ ๊ฐ๋ฅดํค๊ณ ์๋ค.
}
wrapper();//๊ทธ๋ ๊ฒ "zero"๊ฐ ์ถ๋ ฅ๋๋ค.
์ด๋ ๊ฒ ํจ์๊ฐ ์ ์ธํ๋ ์์ ์์ ์ค์ฝํ๊ฐ ์์ฑ๋๋ ํ์์ผ๋ก ๋ฐ์ํ๋ ์ค์ฝํ๋ฅผ
lexical scoping์ด๋ผ๊ณ ํ๋ค!
์ปจํ ์คํธ : ์ฝ๋์ ์คํํ๊ฒฝ!!
์ปจํ ์คํธ๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ์ฝ๋์ ์คํ์์ ์ฆ, ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์์ ๋ฐ๋ผ๊ฐ๋ฉด๋๋ค.
์ฝ๋๋ฅผ ๋ณด๋ฉฐ ์๊ฐ์ ํด๋ณด์!
var name = 'zero'; // 1.๋ณ์์ ์ธ(์ด๊ธฐํ) 6. ๋ณ์ํ ๋น
function wow(word) { //2.๋ณ์์ ์ธ 3.๋ณ์ํ ๋น
console.log(word + ' ' + name); //11
}
function say () { // 4.๋ณ์์ ์ธ 5.๋ณ์ํ ๋น
var name = 'nero'; // 8
console.log(name); // 9
wow('hello'); //10
}
say(); // 7. ํจ์์คํ
์ ์ฝ๋๋ฅผ ์ฃผ์ ๊น๊ฒ ๋ณด๋ฉด ์ปจํ ์คํธ๋ฅผ ์ดํดํ ์ ์๋ค.
์ปจํ ์คํธ
๊ทธ๋ผ ์ ์ฝ๋์์ ์ด๋ค ๊ฒ์ด ์ ์ญ ์ปจํ ์คํธ์ผ๊น?
var name = "zero" ์ ๋ณ์์ ์ธ(์ด๊ธฐํ)
function wow(word)์ ์ ์ธ๊ณผ ํ ๋น
function say()์ ์ ์ธ๊ณผ ํ ๋น
---ํธ์ด์คํ ---
var name = "zero"์ ๋ณ์ ํ ๋น
๊น์ง ์ ์ญ ์ปจํ ์คํธ๋ฅผ ๊ตฌ์ฑํ๊ฒ ๋๋ค.
'์ ์ญ ์ปจํ
์คํธ': {
๋ณ์๊ฐ์ฒด: {
arguments: null,
variable: ['name', 'wow', 'say'],
},
scopeChain: ['์ ์ญ ๋ณ์๊ฐ์ฒด'],
this: window,
}
๋ค์๊ณผ ๊ฐ์ด ์ ์ญ ์ปจํ ์คํธ๊ฐ ๊ตฌ์ฑ๋๊ณ ์ฌ๊ธฐ์ this๋ ๋ฐ๋ก ์ค์ ํ์ง ์ํใด๋ค๋ฉด window๋ฅผ ๊ฐ๋ฅดํจ๋ค. ๋ง์ฝ new๋ฅผ ํธ์ถํ๊ฑฐ๋ this๊ฐ์ bindํ๋ค๋ฉด this๋ ๋ณ๊ฒฝ๋ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ํจ์ say๊ฐ ์ ์ธ๋๋ฉด์ ์๋ก์ด ์ปจํ
์คํธ์ธ sayํจ์์ ์ปจํ
์คํธ๊ฐ ์์ฑ๋๋ค.
์ด๋ ์ปจํ
์คํธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
'say ์ปจํ
์คํธ': {
๋ณ์๊ฐ์ฒด: {
arguments: null,
variable: ['name'], // ์ด๊ธฐํ ํ [{ name: 'nero' }]๊ฐ ๋จ
},
scopeChain: ['say ๋ณ์๊ฐ์ฒด', '์ ์ญ ๋ณ์๊ฐ์ฒด'],
this: window,
}
๋ค์ wow("hello") ํจ์๊ฐ ์คํ๋์ด wowํจ์์ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๋ค.
์ด๋ ํจ์ ์ ์ธ ์์ ์์ ํด๋น ์ค์ฝํ๊ฐ ์ ํด์ง๊ธฐ ๋๋ฌธ์ name ๋ณ์๋ scope chain์ ๋ฐ๋ผ ์์ ๋ณ์๊ฐ์ฒด์์ ์ฐพ๊ฒ๋๋ค. ์ฆ, name์ "zero"๊ฐ ๋๋ค.
'wow ์ปจํ
์คํธ': {
๋ณ์๊ฐ์ฒด: {
arguments: [{ word : 'hello' }],
variable: null,
},
scopeChain: ['wow ๋ณ์๊ฐ์ฒด', '์ ์ญ ๋ณ์๊ฐ์ฒด'],
this: window,
์ ์์๋ฅผ ์ ํํ๊ฒ ์๊ธฐ์ํด์๋ ์ด๋ฒคํธ๋ฃจํ๋ฅผ ์์์ผํ๋ค
์ด๋ ์ด๋ฒ์ฃผ๋ด์ ๋ค์ ์ ๋ฆฌ๋ฅผ ํด๋ณด๊ฒ ๋ค!!
์ด์ ๋ณ์์ ํธ์ด์คํ ์ ๋ํด ๊ณต๋ถ๋ฅผ ํ์๋ค. ๊ฐ๋จํ๊ฒ ๋ณต์ต์ ํ์๋ฉด
์ผ๋จ ๋ชจ๋ ๋ณ์๋ ํธ์ด์คํ
์ด ์ผ์ด๋๋ค.
ํธ์ด์คํ
์ ๋ชจ๋ ๋ณ์์ ์ ์ธ์ด ์ค์ฝํ์ ์ต์๋จ์์ ์ด๋ฃจ์ด์ง๋ ํ์์ ๋งํ๋ค.
const let var์ ๋ณ์ ์ค var์ const,let์ ์ฐจ์ด๊ฐ ์๋ค.
var๋ ํธ์ด์คํ
์ด ์ผ์ด๋๋ฉด์ ์ด๊ธฐํ๋ ๋์์ ์ผ์ด๋๋ค.
๊ทธ๋์ undefined๋ผ๋ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ์ด ๋์ง๋ง
const,let์ ์ ์ธ๋ง ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ์ด๋์ด ๋ณ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ํ ์๊ฐ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ํจ์๋ ์ด๋จ๊น??
ํจ์๋ ํธ์ด์คํ ํ์์ด ์ผ์ด๋๋ค. ์ฌ๊ธฐ์๋ ์ ์ธ์๊ณผ ํํ์์์ ์ฐจ์ด๊ฐ ์๋ค.
์ ์ธ์: function A(){}
ํํ์: const A = ()=>{}
์์ ๊ฐ์ด ์ ์ธ์์ผ ๋๋ ์์์ฒด๊ฐ ํต์งธ๋ก ๋์ด์ฌ๋ ค์ง๋ค.
ํํ์์ผ ๋๋ ์ ์ธ๋ง ์ต์์๋ก ๋์ด์ฌ๋ ค์ง๊ณ ํ ๋น(๋์
)์ ๋ชจ๋ ํธ์ด์คํ
์ด ๋๋ ํ์ ์ด๋ฃจ์ด์ง๋ค. ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ดํดํ ์ ์๋ค.
console.log(zero); //4. ์๋ฌ๊ฐ ์๋๋ผ undefined ์์ง ํ ๋นx
sayWow(); // ์ ์์ ์ผ๋ก wow //5. ์คํ
function sayWow() { //์ ์ธ์ ์ด๊ฒ ๋งจ ์๋ก 1. ์ ์ธ 2. ํ ๋น(๋์
)
console.log('wow'); //6
}
var zero = 'zero';// 3. ๋ณ์ ์ ์ธ 7. ํ ๋น
์คํ์์๋๋ก ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
function sayWow() {
console.log('wow');
}
var zero;
console.log(zero);
sayWow();
zero = 'zero';
ํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ด ํํ์์ผ๋ก ํจ์๋ฅผ ์ ์ธํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น???
sayWow(); // (3)
sayYeah(); // (5) ์ฌ๊ธฐ์ ๋์
๋๊ธฐ ์ ์ ํธ์ถํด์ ์๋ฌ
var sayYeah = function() { // (1) ์ ์ธ (6) ๋์
console.log('yeah');
}
function sayWow() { // (2) ์ ์ธ๊ณผ ๋์์ ๋์
๋ ์ด๋ฃจ์ด์ง
console.log('wow'); // (4)
}
์ด๋ ๊ฒ ํํ์๊ณผ ์ ์ธ์์๋ ์ฐจ์ด๊ฐ ์๋ค.
๊ทธ๋ฅ ์ด๋ ๊ฒ ์๊ฐํ์
์ ์ธ์์ ํต์ผ๋ก ๋งจ์๋ก!
ํํ์์ ์ ์ธ๋ง ๋งจ์๋ก!
ํด๋ก์ ๋ฅผ ์ดํดํ๊ธฐ์ํด ์ ๋ด์ฉ๋ค์ ๊ณต๋ถํ ์ ์์ด์ ์ข์๋ค!!๐
ํด๋ก์ ๋ ์ฌ์ค ์๋ฒฝํ๊ฒ ์ดํดํ ์ํ๊ฐ ์๋๋ผ ์ถํ์ ์์ ์ด ํ์ํ ์ ์๋ค!
ํ์ง๋ง ์ง๊ธ ํ์๊ฐ ์ดํดํ ๋ฐ๋ก ์ ์ํด๋ณด๊ฒ ๋ค!!
ํด๋ก์ : ์ด๋ค Aํจ์์์ ์ ์ธํ ๋ณ์ ๋ฅผ ์ฐธ์กฐํ๋ ๋ด๋ถํจ์ B๋ฅผ ์ธ๋ถ๋ก ์ ๋ฌํ ๊ฒฝ์ฐ Aํจ์์ ์คํ ์ปจํ ์คํธ๊ฐ ์ข ๋ฃ๋์ด๋ ๋ณ์ a๊ฐ ์ฌ๋ผ์ง์ง ์๋ํ์!
-์ถ์ฒ- ์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธ
์ ๋ง์ ์ดํดํ๋ ค๋ฉด ์ปจํ ์คํธ , ์ค์ฝํ๋ฑ์ ์์์ผํ๋ค.
์ฝ๋๋ก ์๊ฐํด๋ณด๋ฉด
function A(){
const a = "123"
function a(){
return a+1
}
return a()
}
const number = A()
console.log(number) // 2
//a์ ๊ฐ์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.
A ํจ์ ๋ด๋ถ์ ์กด์ฌํ๋ aํจ์๋ lexical scoping์ ๋ฐ๋ผ์ a๋ฅผ ํจ์ A์์ ๊ฐ์ ธ์ค๊ฒ๋๋ค.(scope chain) ๊ทธ๋ ๋ค๋ฉด aํจ์๋ a์ +1 ์ ๋ํ ๊ฐ์ return ํ๋๋ฐ A๋ ์ด๋ฌํ aํจ์๋ฅผ return ํ์ฌ
ํจ์ ์ธ๋ถ ์ฆ, A์ค์ฝํ ๋ฐ์์ ์ a๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
ํจ์๊ฐ ์ข
๋ฃ๋๋ฉด ํด๋น ์ปจํ
์คํธ๋ ์ ๊ฑฐ๋๋๋ฐ ๊ทธ๋ผ์๋ a๋ ์ค์ฝํ ์ฒด์ด๋์ ์ํด ์ด์๋จ๊ฒ๋๋ค!! ์ด๊ฒ์ด ํด๋ก์ ์ด๋ค.
๊ฒฐ๊ตญ ํด๋ก์ ๋ ์ค์ฝํ ์ฒด์ด๋์ ์ด์ฉํ ๋ณ์ ๋นผ๋๋ฆฌ๊ธฐ? ์ด๋ค ใ ใ
๋ณดํต์ ํจ์ ๋ฆฌํด์ ํตํด ํด๋ก์ ๋ฅผ ๋ง๋๋ ์ฌ๋ก๊ฐ ๊ฐ์ฅ ๋ง๋ค!!
์ฐธ๊ณ ํ๋ธ๋ก๊ทธ-์บกํดํ๊ต
์ฐธ๊ณ ํ๋ธ๋ก๊ทธ-ํ๋๋ชฌ
์ฐธ๊ณ ํ๋ธ๋ก๊ทธ-์ ๋ก์ด