Bibi's DevLog ๐ค๐
[์ธํ๋ฐ]Javascript - ๋ณ์์ ์ค์ฝํ(์ ์ญ ๋ณ์, ์ง์ญ ๋ณ์, ์๋ ์ ์ญ ๋ณ์, ๋งค๊ฐ๋ณ์์ ์ค์ฝํ, for๋ฌธ ์์ ์ค์ฝํ, const์ let, ํธ์ด์คํ , ํด๋ก์ ธ) ๋ณธ๋ฌธ
[์ธํ๋ฐ]Javascript - ๋ณ์์ ์ค์ฝํ(์ ์ญ ๋ณ์, ์ง์ญ ๋ณ์, ์๋ ์ ์ญ ๋ณ์, ๋งค๊ฐ๋ณ์์ ์ค์ฝํ, for๋ฌธ ์์ ์ค์ฝํ, const์ let, ํธ์ด์คํ , ํด๋ก์ ธ)
๋น๋น bibi 2020. 10. 30. 14:43* ์ด ๊ธ์ ์ธํ๋ฐ์์ ์ ๊ณตํ๋ ํธ๋ ์ค๋์ ์ ๋ฃ ๊ฐ์ '์ฝ๊ณ ์์ฐ์ค๋ฝ๊ฒ ๋ฐฐ์๋ณด๋ Javascript ์ ๋ฌธ - ์ฝ๋์ค์ฟผ๋ ๋ง์คํฐ์ฆ ์ฝ์ค ๋ ๋ฒจ1'๋ฅผ ๋ฃ๊ณ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ๊ฐ์ ๋ด์ฉ์ ๋ํด, ์ ๊ฐ ํ๊ธฐํ๊ณ ๊ตฌ๊ธ๋งํ ๋ด์ฉ์ด ์ ๋ฆฌ๋์ด ์์ต๋๋ค. ์ด๋ณด์ธ ์ ๊ฐ ์ดํดํ ๋๋ก ์ ๋ฆฌํ๊ธฐ ๋๋ฌธ์, ๋ถ์ ํํ ๋ด์ฉ์ด ์์ ์ ์์์ ๊ฐ์ํด ์ฃผ์๊ธธ ๋ฐ๋๋๋ค. ๊ฐ์๋ฅผ ๋ฃ๊ณ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ด๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค๋ ์ธํ๋ฐ ์ธก ๋ต๋ณ์ ๋ฐ์ ์ ์ด ์์ผ๋(https://bibi6666667.tistory.com/37), ์ ์๊ถ์ ๋ฌธ์ ๊ฐ ๋๋ค๋ฉด ๋ณดํธ ๋ชจ๋(๋น๊ณต๊ฐ)๋ก ์ ํํ๊ฒ ์ต๋๋ค.
์ค์ฝํ Scope๋?
- ๋ณ์์ ์ ํจ๋ฒ์.
- ๊ฒ์ํค์๋(๊ตฌ๊ธ๋ง): javascript scope
๊ฐ์ ๊ฒ์์๋ฃ๋ฅผ ์ฝ์ด๋ณด๊ณ , ์กฐ๊ธ ๋ ๊ณต๋ถํด ๋ณด์ธ์. (์์ต)
์ ์ญ ๋ณ์ global variable
var a = 10
console.log(a);
// a๋ ์ ์ญ๋ณ์.
ํจ์ ์ธ๋ถ์์ ์ ์ธ๋ ๋ณ์.
์ ์ญ๋ณ์๋ ์ด๋ค ํจ์ ๋ด์์๋ ์ฌ์ฉํ ์ ์๋ค.
๐๋ง์ด ์ฐ๋ฉด ์ข์ง ์์ต๋๋ค. ์์ ์ ์ธ ์ ์์ง๋ง, ๊ฐ๊ธ์ ์ด๋ฉด ์ฌ์ฉํ์ง ์๋ ๊ฒ ์ข์ต๋๋ค.
(์ฝ๋ฉ ์ค ์ ์ญ๋ณ์ ๋๋ฌธ์ ์์ํ ์๋ฌ๋ค์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ)
๐๋งค๊ฐ๋ณ์์ return์ ์ ์ฐ๋ฉด ์ ์ญ๋ณ์ ์ฌ์ฉ์ ์ค์ผ ์ ์๋ค. (= ๊ฒฐ๊ตญ ํจ์๋ฅผ ์ ์จ์ผ ํ๋ค)
์ง์ญ ๋ณ์ local variable
var foo = function (){
var b = 25;
console.log(a); // a๋ ์ ์ญ๋ณ์์ด๋ฏ๋ก ํจ์ ๋ด์์๋ ์ฌ์ฉ ๊ฐ๋ฅ.
console.log(b);
};
foo();
b; // b๋ ์ง์ญ๋ณ์์ด๋ฏ๋ก ์ ์ญ์์ ํธ์ถํ๋ฉด b is not defined ์๋ฌ๊ฐ ๋ฌ๋ค.
ํจ์ ์์์ ์ ์ธ๋ ๋ณ์.
๐์ง์ญ๋ณ์๊ฐ ์ ์ธ๋ ํจ์ ์ธ๋ถ์์๋ ๊ทธ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์๋ ์ ์ญ ๋ณ์
var foo2 = function (){
c = 100;
console.log(c);
};
c;
// c๋ foo2ํจ์ ๋ด์์ ์ ์ธํ์ง๋ง var์์ด ์ ์ธํด ์๋์ ์ญ๋ณ์๊ฐ ๋์๋ค. ์ ๋ ๋น์ถ
์๋ฐ์คํฌ๋ฆฝํธ์์ ์ ๊ณตํ๋ ๋์ ๊ธฐ๋ฅ.
ํจ์ ์์์ var ์์ด ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ์๋ ์ ์ญ ๋ณ์๊ฐ ๋๋ค. ์ ๋๋ก ์ด๋ ๊ฒ ํ๋ฉด ์ ๋ฉ๋๋ค!
๋งค๊ฐ๋ณ์(ํ๋ผ๋ฏธํฐ)์ ์ค์ฝํ
var foo3 = function(v) {
console.log(v);
}
foo3(25);
v;
// v๋ foo3(v)์ ๋งค๊ฐ๋ณ์์ด๋ฏ๋ก ์ง์ญ๋ณ์์ ๊ฐ์ ์ทจ๊ธ.
๐ํจ์์ ๋งค๊ฐ ๋ณ์(ํ๋ผ๋ฏธํฐ, parameter)๋ ์๋์ผ๋ก ์ง์ญ ๋ณ์ ์ทจ๊ธ.
(ํจ์ ๋ด์์ ์ฐ์ด๋ ๋งค๊ฐ๋ณ์๋ ๊ทธ ํจ์ ๋ฐ๊นฅ์์ ์ฝ๊ณ ์ธ ์ ์๋ค. ๋งค๊ฐ๋ณ์ = ์ผ์ข
์ ์ง์ญ ๋ณ์.)
for๋ฌธ ์์์ ์ฌ์ฉ๋ ๋ณ์์ ์ค์ฝํ
for (var i = 0; i < 5; i++) {
console.log(i);
} // 0, 1, 2, 3, 4
i; // 5. i๋ ์ ์ญ๋ณ์๋ก ์ทจ๊ธ๋๋ค.
var foo4 = function () {
for (var j = 0; j < 5; j++) {
console.log(j);
}
console.log(j);
// for๋ฌธ์ด foo4๋ผ๋ ํจ์ ์์ ์์ผ๋ฏ๋ก, j๋ ์ง์ญ๋ณ์.
}
// 0, 1, 2, 3, 4, 5๊ฐ ์ถ๋ ฅ๋จ. 0~4๋ ๋ฐ๋ณต๋ฌธ์ผ๋ก๋ถํฐ, 5๋ ๋ฐ๋ณต๋ฌธ ๋ฐ๊นฅ์ผ๋ก๋ถํฐ.
// j๊ฐ 5๊ฐ ๋๋ ์๊ฐ for๋ฌธ์ ๋น ์ ธ๋์ค๊ธฐ ๋๋ฌธ์, for๋ฌธ ๋ฐ๊นฅ์์ j=5์ด๋ค.
j; // j๋ ์ง์ญ๋ณ์๋ก, ํจ์ ๋ฐ๊นฅ์์ ์ธ ์ ์๋ค.
์ธ์ด๋ง๋ค ๋ค๋ฅธ๋ฐ, ์๋ฐ์คํฌ๋ฆฝํธ์์๋ for๋ฌธ ์์์ ์ ์ธํด๋ for๋ฌธ ๋ฐ๊นฅ์์ ์ ์ธ๋ ๊ฒ๊ณผ ๋์ผํ ํจ๊ณผ์
๋๋ค.
for๋ฌธ ์กฐ๊ฑด๋ฌธ์ ์ ์ธ๋ ๋ณ์ (i,j ๋ฑ..) = ์ ์ญ ๋ณ์.
(for๋ฌธ์ ํจ์ ์์ ๋ฃ์ด์ ์ฌ์ฉํ์ง ์์ผ๋ฉด i, j .. ๋ฑ๋ฑ์ ์ ์ญ๋ณ์๊ฐ ๋๋ค)
const์ let
Javascript ES6๋ฒ์ ์์ ์๋ก ๋ฑ์ฅํ ๋ฌธ๋ฒ์ผ๋ก, var ์๋ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ๋์ํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ฐ์ตํ ๋๋ const์ let์ ์ฐ๋ ๊ฑธ ๊ถ์ฅํฉ๋๋ค.
( ์ง๊ธ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ด๋ณด๋ผ var๋ฅผ ์ฐ์ง๋ง, ๋์ค์๋ const์ let ๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค)
const
: (var์ ๋ฌ๋ฆฌ) const๋ก ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ๊ฐ์ ์์ ํ ์ ์๊ณ , ์ฌ์ ์ธ ํ ์ ์๋ค.
- ์๋ฌ๋ฅผ ๋ง์์ฃผ๊ธฐ ๋๋ฌธ์ ์ข๋ค.
: const๋ ์ฝ๊ธฐ ์ ์ฉ์ด๋ค.
const d = 10;
//d = 25; // ์๋ฌ. const๋ก ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ๊ฐ์ ์์ ํ ์ ์์.
//const d = 10; // ์๋ฌ. const๋ก ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ์ฌ์ ์ธํ ์ ์์.
// const๋ ์ฝ๊ธฐ ์ ์ฉ.
let
: let์ผ๋ก ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ๊ฐ์ ์์ ํ ์ ์๋ค. but ์ฌ์ ์ธ์ ํ ์ ์๋ค.
: let์ ์ฝ๊ธฐ, ์ฐ๊ธฐ ๊ฒธ์ฉ์ด๋ค.
: let์ ๋ธ๋ก ๋ฒ์ ์ค์ฝํ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
(let์ผ๋ก ์ ์ธ๋ ๋ณ์๋ ๋ธ๋ก ๋ฒ์๋ฅผ ๋์ด๊ฐ๋ฉด ์ฌ์ฉํ ์ ์๋ค)
-> ์ข๋ ์ ๊ตํ๊ณ ์ค์๋ฅผ ๋ง์ ์ ์์ด ์ข๋ค.
let x = 10;
x = 15;// let์ผ๋ก ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ๊ฐ์ ์์ ํ ์ ์์.
// let x = 20; // ์๋ฌ. let๋ ์ฌ์ ์ธ์ ๋ถ๊ฐ๋ฅํ๋ค.
// let์ ์ฝ๊ธฐ, ์ฐ๊ธฐ ๊ฒธ์ฉ์ด๋ค.
var foo5 = function () {
let y = 20;
console.log(y);
}
foo5(); // 20
// y; // ์๋ฌ. y is not defined
// let์ผ๋ก ์ ์ธํ๋ฉด ๊ทธ ๋ธ๋ก ๋ด์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ(๋ธ๋ก ์ค์ฝํ)
for (let k = 0; k < 5; k++) {
console.log(k);
}
//k; // ์๋ฌ. let์ผ๋ก ์ ์ธํ ๋ณ์๋ var๊ณผ ๋ฌ๋ฆฌ ๋ธ๋ก์ค์ฝํ์ด๋ฏ๋ก
// for๋ฌธ ๋ธ๋ก์ ๋ฒ์ด๋๋ฉด ์ฌ์ฉํ ์ ์๋ค.
โ ์ด๋ณด๋ผ๋ฉด..
๐์ผ๋จ ๋ณ์ ์ ์ธ์ ๋ฌด์กฐ๊ฑด const๋ก ํ์.
๐const๋ก ์ ๋๋ ์ํฉ ๋ฐ์์์ let์ ์ฐ์.
(์ด๋ณด๋ค์ ์ด๋ค ๋ณ์๊ฐ ์ฝ๊ธฐ ์ ์ฉ์ธ์ง / ์ฝ๊ธฐ, ์ฐ๊ธฐ ๊ฒธ์ฉ์ธ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์,
์ฐ์ ๋ชจ๋ ๋ณ์๋ฅผ ์ฝ๊ธฐ ์ ์ฉ์ธ const๋ก ์ ์ธํ๊ณ ,
๊ทธ ๋ณ์๊ฐ ์ฝ๊ธฐ,์ฐ๊ธฐ ๊ฒธ์ฉ์ด ๋์ด์ผ ํ ๋ let์ผ๋ก ๋ฐ๊ฟ์ ์ ์ธํ๋ฉด ๋๋ค.)
ํธ์ด์คํ hoisting
๋ ๊ฒ์ํด์ ๊ณต๋ถํด ๋ด ์๋ค.
console.log(b);
const b = 10;
console.log(b);
// 1๋ฒ์งธ ์ค์์ ์๋ฌ. Uncaught ReferenceError: Cannot access 'b' before initialization
// ๋ณ์๋ฅผ ์ ์ธ๋ ํ๊ธฐ ์ ์ ๊ฐ์ ์ฐ๋ ค๊ณ ํ๋ ์๋ฌ๊ฐ ๋ ๊ฒ.
console.log(a);
var a = 10;
console.log(a);
//undefined
//10
// const๋ก b๋ฅผ ์ ์ธํ์ ๋์ ๋ฌ๋ฆฌ, var๋ก a๋ฅผ ์ ์ธํ๋ ์๋ฌ๊ฐ ๋จ์ง ์๊ณ undefined๊ฐ ๋ธ.
var๊ฐ ์ ์ข์ ์ด์ ์ค ํ๋?์ด๋ค.
var๋ก ๋ณ์ a๋ฅผ ์ ์ธํ๊ณ , ์ ์ธํ๊ธฐ ์ ์์น์์ a๋ฅผ ๊ฐ์ ธ๋ค ์ฐ๋ฉด ์๋ฌ๊ฐ ์๋ undefined๊ฐ ๋ฌ๋ค.
์ด๋ var๋ก ๋ณ์๋ฅผ ์ ์ธํ๋ฉด,
console.log(a)๋ฅผ ์ฒซ ๋ฒ์งธ๋ก ์ฐ์์ ๋ ์ด๋ฏธ a๋ผ๋ ๋ณ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ฒ๋ฆผ.
๊ทธ๋ฆฌ๊ณ a๋ผ๋ ๋ณ์๊ฐ ์๊ธด ํ์ง๋ง ๊ฐ์ด ์ ์๋์ง ์์์ผ๋ฏ๋ก undefined๊ฐ ๋จ๋ ๊ฒ.
์ด์ ๊ฐ์ ํ์์ ์๋ฐฉํ ์ ์๊ธฐ ๋๋ฌธ์ const๋ก ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ฒ์ด ์ข๋ค.
ํด๋ก์ ธ(closure)
ํด๋ก์ ธ๋ ๊ณ ๊ธ ์ฃผ์ ์ค ํ๋์
๋๋ค. ๊ด์ฌ์ด ์์ผ์๋ฉด ๊ฒ์ํด์ ๊ณต๋ถํด ๋ณด์ธ์.
์ด๊ธ์์๋ ๊ณต๋ถ ์ ํด๋ ๋๋ ์ฃผ์ ์ด์ง๋ง ์ค๊ธ์์๋ ๊ผญ ์์์ผ ํ๋ ๊ฒ ์ค ํ๋์
๋๋ค.
(์ฐ์ ์ 'ํด๋ก์ ธ'๋ผ๋ ๊ฐ๋
์ด ์๋ค ์ ๋๋ง ์์๋์..)