μνμ½λ© ν΄λ‘μ κ°μ 1 ~ 4νΈ
μ¬μ νμ΅ κ°μ΄λ STEP 5 (Hoisting ~ Reference)
μνμ½λ© ν΄λ‘μ κ°μ (1 ~ 4νΈ) μ°Έκ³
μΆκ°λ‘ ES2015 μ΄νμ μ€ν 컨ν
μ€νΈ μ°Έκ³ ν κ²
function outter () { // μΈλΆ ν¨μ μ μΈ
var title = 'coding everybody'; // μΈλΆ ν¨μμ μ μλμ΄ μλ μ§μλ³μ
function inner () { // λ΄λΆ ν¨μ μ μΈ
alert(title);
}
inner (); // λ΄λΆ ν¨μ νΈμΆ
}
outter (); // μΈλΆ ν¨μ νΈμΆ
inner()λΌλ λ΄λΆ ν¨μλ titleμ΄λΌλ λ³μλ₯Ό μ°Έμ‘°νλλ° inner ν¨μ μμμ μ체μ μΌλ‘ κ·Έ κ°μ μ°Ύμ μ μμΌλ―λ‘ ν λ¨κ³ μμΈ outter()λΌλ μΈλΆ ν¨μλ₯Ό μ°Ύμλ³΄κ² λλ€. μΈλΆ ν¨μμ titleμ΄λΌλ λ³μκ° μ‘΄μ¬νλ―λ‘ λ΄λΆ ν¨μμ title λ³μλ κ·Έ κ°μ κ°κ² λλ€.
μ¦, λ΄λΆ ν¨μμμ μΈλΆ ν¨μμ μ§μλ³μμ μ κ·Όν μ μλ€
μμ μ΄ μ μΈλ λΉμμ νκ²½μ κΈ°μ΅νλ ν¨μμ κ·Έ νκ²½
μΈλΆ ν¨μ 컨ν μ€νΈμ μ κ·Όν μ μλ λ΄λΆ ν¨μ
μΈλΆ ν¨μκ° μ’ λ£λ μ΄νμλ λ΄λΆ ν¨μλ μΈλΆ ν¨μμ μ§μ λ³μμ μ κ·Ό κ°λ₯
function outter () {
var title = 'coding everybody';
// outterλΌλ μΈλΆ ν¨μμ μ μλμ΄ μλ μ§μλ³μ
return function () {
alert(title);
}
// outterλΌλ μΈλΆ ν¨μλ μ΅λͺ
μ λ΄λΆ ν¨μλ₯Ό return νλ€
}
var inner = outter();
// outterλΌλ μΈλΆ ν¨μλ₯Ό μ€νν κ²°κ³Όλ₯Ό innerλΌλ λ³μμ ν λΉνλ€
inner();
// innerλΌλ λ³μμ λ΄κ²¨ μλ ν¨μλ₯Ό νΈμΆνλ©΄
// coding everybodyλΌλ ν
μ€νΈκ° κ²½κ³ μ°½μ μΆλ ₯λλ€
μλ μ΄λ€ ν¨μκ° returnμ νλ©΄ κ·Έ ν¨μλ μ’ λ£λλ€. μ¦, outterλΌλ μΈλΆ ν¨μκ° λ΄λΆ ν¨μλ₯Ό returnνλ©΄ outterλΌλ μΈλΆ ν¨μλ μ’ λ£λλ€.
λ€μ λ§ν΄, λ§μ§λ§μ innerλΌλ λ³μμ λ΄κΈ΄ ν¨μλ₯Ό νΈμΆν λλ outterλΌλ μΈλΆ ν¨μλ μ΄λ―Έ μ€νλμ΄(=return λμ΄) μ’ λ£λ μ΄νμμ μ μ μλ€.
μ¬κΈ°μ innerλΌλ λ³μμ λ΄κΈ΄ ν¨μλ₯Ό νΈμΆνλ€λ κ²μ alert(title); ꡬ문μ μ€ννλ€λ λ»μ΄λ€. κ·Έλ°λ° titleμ΄λΌλ λ³μμ κ°μ μ΅λͺ μ λ΄λΆ ν¨μμ μ‘΄μ¬νμ§ μμΌλ―λ‘ ν λ¨κ³ μμΈ outterλΌλ μΈλΆ ν¨μλ₯Ό μ°Ύμλ³΄κ² λλ€. μ¦, λ΄λΆ ν¨μμμ μΈλΆ ν¨μλ‘ μ κ·Όμ μλν΄ μ±κ³΅ν κ²μ΄λ€.
μ 리νλ©΄,
ν΄λ‘μ
λ λ΄λΆ ν¨μκ° μΈλΆ ν¨μμ μ§μλ³μμ μ κ·Όν μ μκ³ , μΈλΆ ν¨μλ μΈλΆ ν¨μμ μ§μλ³μλ₯Ό μ¬μ©νλ λ΄λΆ ν¨μκ° μλ©Έλ λκΉμ§ μλ©Έλμ§ μλ νΉμ±μ μλ―Ένλ€.
μ½λκ° λ³΅μ‘ν΄μ§ λ κ·Έ μ 보λ₯Ό μ무λ μμ νλ κ²μ λ°©μ§νλ κ²
(1) κ°μ²΄λ₯Ό returnνλ μΈλΆ ν¨μ
function factory_movie (title) {
return {
get_title : function () {
return title;
},
set_title : function (_title) {
title = _title;
}
} // factory_movieλΌλ μΈλΆ ν¨μλ κ°μ²΄λ₯Ό return νλ€
}
factory_movieλΌλ μΈλΆ ν¨μλ titleμ΄λΌλ
맀κ°λ³μ
λ₯Ό κ°μ§λ€. 맀κ°λ³μλ κ·Έ ν¨μμμλ§ μ¬μ©λλμ§μλ³μ
μ΄λ€.factory_movieλΌλ μΈλΆ ν¨μλ
{κ°μ²΄}λ₯Ό return
νλ€. κ·Έ κ°μ²΄λ get_titleκ³Ό set_titleμ΄λΌλ 2κ°μ νλ‘νΌν°λ₯Ό κ°μ§κ³ μλ€.
κ°μ²΄μ get_title νλ‘νΌν°
λ titleμ΄λΌλ λ³μλ₯Ό return νλ μ΅λͺ μ ν¨μλ₯Ό κ°μΌλ‘ κ°μ§λ€.κ°μ²΄μ set_title νλ‘νΌν°
λ _titleμ΄λΌλ 맀κ°λ³μμ κ°μ titleμ΄λΌλ λ³μμ ν λΉνλ ν¨μλ₯Ό κ°μΌλ‘ κ°μ§λ€.get_title λ©μλμ set_title λ©μλμ κ°μΈ
function () {...}
λΆλΆμ κ°μ²΄μ μμλμ΄ μμ λΏ, λͺ¨λ factory_movieλΌλ μΈλΆ ν¨μμλ΄λΆ ν¨μ
μ΄λ€.μ΄λ 곧 μ΄ λ΄λΆ ν¨μλ€λ κ·Έ λ΄λΆ ν¨μλ₯Ό ν¬ν¨νλ μΈλΆ ν¨μμ titleμ΄λΌλ μ§μ λ³μμ μ κ·Όν μ μμμ λ»νλ€.
get_title λ©μλ
λ₯Ό νΈμΆνλ©΄ titleμ΄λΌλ λ³μλ₯Ό return νλ€. κ·Έλ°λ° μ΄ titleμ΄λΌλ λ³μμ κ°μ μ΅λͺ μ λ΄λΆ ν¨μμ μ‘΄μ¬νμ§ μμΌλ―λ‘ factory_movieλΌλ μΈλΆ ν¨μλ₯Ό μ°Ύμλ³΄κ² λλ€. κ·Έλ κ² λ΄λΆ ν¨μλ μΈλΆ ν¨μμ titleμ΄λΌλ μ§μλ³μμ μ κ·Όνμ¬ κ·Έ κ°μ λ°μμ€κ² λλ€.
set_title λ©μλ
λ₯Ό νΈμΆνλ©΄ _titleμ΄λΌλ 맀κ°λ³μμ κ°μ titleμ΄λΌλ λ³μμ ν λΉνλ€. λ΄λΆ ν¨μλ μΈλΆ ν¨μμ μ§μλ³μμ μ κ·Όν μ μμΌλ―λ‘ μ΄λ κ² titleμ΄λ λ³μμ ν λΉλ _titleμ΄λΌλ 맀κ°λ³μμ κ°μ μΈλΆ ν¨μμ μ§μ λ³μμΈ titleμ λ°κΎΈκ² λλ€.
(2) λ΄λΆ ν¨μλ μΈλΆ ν¨μμ μ§μλ³μμ μ κ·Όν μ μλ€
function factory_movie (title) {
return {
get_title : function () {
return title;
},
set_title : function (_title) {
title = _title;
}
}
}
var ghost = factory_movie('Ghost in the shell');
var matrix = factory_movie('Matrix');
console.log(ghost.get_title());
console.log(matrix.get_title());
factory_movieλΌλ μΈλΆ ν¨μλ₯Ό νΈμΆνκ³ , 맀κ°λ³μμ κ°κ° 'Ghost in the shell'μ 'matrix'λ₯Ό μ ν΄μ€¬λ€. μΈλΆ ν¨μκ° return νλ κ°μ²΄λ₯Ό κ°κ° ghostμ matrixλΌλ λ³μμ ν λΉνλ€.
μ΄λ ghostμ matrixλ λκ°μ κ°μ²΄λ₯Ό λ΄κ³ μμ§λ§, κ·Έ κ°μ²΄λ€μ΄
μ€νλ 컨ν μ€νΈλ μλ‘ λ€λ₯΄λ€.
μ¦, κ° κ°μ²΄λ€μ get_title λ©μλκ° μ κ·Όνλ, μΈλΆ ν¨μμ titleμ΄λΌλ λ³μμ λ΄κ²¨ μλ κ°μ΄ μλ‘ λ€λ¦μ μλ―Ένλ€.
(3) closure(ν΄λ‘μ )μ ν¬ν¨λμ΄ μλ μ§μλ³μλ κ°κ° μ μ§λλ€
function factory_movie (title) {
return {
get_title : function () {
return title;
},
set_title : function (_title) {
title = _title;
}
}
}
var ghost = factory_movie('Ghost in the shell');
var matrix = factory_movie('Matrix');
ghost.set_title('곡κ°κΈ°λλ'); // ghost κ°μ²΄μ set_title λ©μλ νΈμΆ
console.log(ghost.get_title());
console.log(matrix.get_title());
ghost κ°μ²΄μ set_title λ©μλλ₯Ό νΈμΆνκ³ , 맀κ°λ³μλ‘ '곡κ°κΈ°λλ'λ₯Ό μ ν΄μ£Όμλ€.
κ·Έ ν, ghost κ°μ²΄μ get_title λ©μλλ₯Ό νΈμΆν κ°μ '곡κ°κΈ°λλ'κ° λ¬λ€. κ·Έλ¬λ matrix κ°μ²΄μ get_title λ©μλλ₯Ό νΈμΆν κ°μ μ¬μ ν 'matrix'κ° λ¬λ€.
μ 리νλ©΄, factory_movie μΈλΆ ν¨μλ ghostμ matrixλΌλ 2κ°μ κ°μ²΄λ₯Ό λ§λ€μλ€. μ΄ 2κ°μ κ°μ²΄λ€μ κ°κ° μμ λ€μ΄ λ§λ€μ΄μ§ κ·Έ μμ μ 컨ν μ€νΈ μ¦, μμ λ€μ΄ λ§λ€μ΄μ§ κ·Έ μμ μμμ μΈλΆ ν¨μμ μ§μλ³μμ μ κ·Όν μ μλ€. κ·Έ μ§μλ³μλ
κ°κ°
μ μ§λκ³ μμΌλ―λ‘ ghost κ°μ²΄μ set_titleμ ν΅ν΄μ title λ³μλ₯Ό '곡κ°κΈ°λλ'λ‘ λ°κΎΈλ κ²μ ghost κ°μ²΄κ° μ κ·Όν μ μλ μΈλΆ ν¨μμ μ§μλ³μλ§μ λ°κΎΈλ κ²μΌ λΏ, matrix κ°μ²΄κ° μ κ·Όν μ μλ μΈλΆ ν¨μμ μ§μλ³μμλ μλ¬΄λ° μν₯λ λ―ΈμΉμ§ λͺ»νλ€.β μΈλΆ ν¨μκ° μ€νλ λλ§λ€ μλ‘μ΄ μ§μλ³μλ₯Ό ν¬ν¨νλ
closure(ν΄λ‘μ )
κ° μμ±λλ€. λ°λΌμ ghostμ matrixλ μλ‘ μμ ν λ 립λ κ°μ²΄κ° λλ€.
private variable
μ΄λ?factory_movieλΌλ μΈλΆ ν¨μκ° μ€νλμ΄ μ΄λ€ κ°μ return νλ©΄ κ·Έ ν¨μλ μ’
λ£λκ³ , μΈλΆ ν¨μμ μ§μλ³μμΈ titleμ factory_movieμ λ΄λΆ ν¨μμΈ get_titleκ³Ό set_titleμ ν΅ν΄μλ§ μ κ·Όν μ μκ² λλ€. μ΄λ titleμ private variable
μ΄λΌκ³ νλ€.
λ°μ΄ν°λ₯Ό λꡬλ μμ ν μ μλ€λ©΄ κ·Έλ§νΌ μ€λ₯κ° λ κ°λ₯μ±μ΄ ν¬λ€. μ΄λ₯Ό λ°©μ§νκΈ° μν΄ private variableμ μ΄μ©ν μ μλ€.
μ μμμμλ titleμ΄λΌλ μΈλΆ ν¨μμ μ§μλ³μμ get_title ν¨μμ set_title ν¨μλ§μ μ΄μ©ν΄μΌλ§ μ κ·Ό κ°λ₯νλλ‘ ν΄μ£Όμλ€.
μ΄ κ²½μ° titleμ΄λ μΈλΆ ν¨μμ μ§μλ³μκ° μΈλΆμμ μ΄λ»κ² μ°μ΄λ κ°μ λ΄λΆ ν¨μμλ μν₯μ μ€ μ μκΈ° λλ¬Έμ λ°μ΄ν°λ₯Ό ν¨μ¬ λ μμ νκ² μ μ§ν μ μλ€.
titleμ΄λΌλ private variable
μ set_titleμ ν΅ν΄μλ§ κ·Έ λ³μμ κ°μ μμ ν μ μκ³ , get_titleμ ν΅ν΄μλ§ κ·Έ λ³μμ κ°μ κ°μ Έμ¬ μ μλ€. ([TIL] 210904 δΈ 'μ κ·Όμ νλ‘νΌν°' λΆλΆ κ°μ΄ λ³Ό κ²)
μμ
function factory_movie (title) { return { get_title : function () { return title; }, set_title : function (_title) { if (typeof _title === 'string') { title = _title; } else { alert('μ λͺ©μ λ¬Έμμ΄μ΄μ΄μΌ ν©λλ€.'); } } } } var ghost = factory_movie('Ghost in the shell'); ghost.set_title(1); // console μ°½μ κ²½κ³ μ°½μ΄ λ¬λ€ ghost.set_title('곡κ°κΈ°λλ'); console.log(ghost.get_title()); // 곡κ°κΈ°λλ
βββ λΉλκΈ°ν¨μλ₯Ό λ°λ³΅λ¬Έμμ μ¬μ©νλ λ°©λ² μ°Έκ³ βββ
μλ°μ€ν¬λ¦½νΈ μμ§μ scriptλ₯Ό μ€ννλ€κ° ν¨μ
λ₯Ό λ§λλ©΄ μ€ν 컨ν
μ€νΈλ₯Ό μμ±νλ€
μ€ν 컨ν
μ€νΈλ ν¨μκ° μ€νλ λμ νκ²½μ μ μ₯
νλ€
μ€ν 컨ν
μ€νΈλ μμ λ§μ μ€μ½ν
λ₯Ό κ°λλ€
μ μ 컨ν μ€νΈμ ν¨μ 컨ν μ€νΈκ° μλ€
κ° ν¨μλ³λ‘ ν¨μ 컨ν μ€νΈλ₯Ό κ°μ§κ³ μμ§λ§, ν¨μ 컨ν μ€νΈλ ν¨μκ° νΈμΆλμ΄μΌλ§ λ§λ€μ΄μ§λ€
[ μμ λΆμ ]
var x = 10; var y = 20; function print() { var x = 5; console.log(x, y); } print();
μ΄λ₯Ό μ€ν 컨ν μ€νΈ μ μ₯μμ μ΄ν΄λ³΄λ©΄,
- κΈλ‘λ² μ€λΈμ νΈ(GO) (x = 10 / y = 20 / print = function)
- μλ°μ€ν¬λ¦½νΈκ° μ€νλλ©΄ κΈλ‘λ² μ€λΈμ νΈκ° μμ±λλ€
- GOμλ
μ μ λ³μλ€
κ³Όν¨μ
κ° νλ‘νΌν°λ‘ μ μ₯λλ€
- print 컨ν μ€νΈ (x = 5)
- μ°Έμ‘°ν λ³μ (x = 5 / y = 20)
[ κ³Όμ λΆμ ]
Q. 1μ΄ κ°κ²©μΌλ‘ 0~3κΉμ§μ μ«μκ° μμλλ‘ μΆλ ₯λλλ‘ λ§λ€μ΄λΌ.
// μ€λ΅ λΆμ (μ λ΅ μλ) for (var i = 0; i < 4; i++) { setTimeout(() => { console.log(i); }, 1000); }
μ΄λ₯Ό μ€ν 컨ν μ€νΈ μ μ₯μμ μ΄ν΄λ³΄λ©΄,
- varμ μ΄μ©ν΄ μ μΈλ λ³μ iλ μ μ λ³μλ‘ hoisting(νΈμ΄μ€ν )λλ€. for λ°λ³΅λ¬Έμ΄ μμλλ©΄ λ³μ iμλ 0μ΄ ν λΉλλ€.
- iκ° 4λ³΄λ€ μλ€λ 쑰건μ λ§μ‘±νλ―λ‘ κ³§λ°λ‘ λ°λ³΅λ¬Έμ λ³Έλ¬Έμ μ€ννκ³ μ νλ€.
- κ·Έλ¬λ μμ setTimeout ν¨μλ 1μ΄(1000ms = 1s)κ° μ§λ λκΉμ§ ν¨μλ₯Ό μ€ννμ§ μκ³ λκΈ°νλ ν¨μμ΄λ€.
- λ°λ©΄, for λ°λ³΅λ¬Έμ μλκ° λ§€μ° λΉ λ₯΄κΈ° λλ¬Έμ μ²μ λ³Έλ¬ΈμΌλ‘ κ°λ€κ° i++λ₯Ό κ±°μ³ λ°λ‘ λ€μ iμ 1μ΄λ κ°μ ν λΉνκ² λκ³ , λ λ€μ λ³Έλ¬ΈμΌλ‘ κ°λ€κ° λ€μ iλ‘ λμ΄κ°κΈΈ λ°λ³΅νκ² λλ€.
- κ²°κ΅ 1μ΄λ³΄λ€ ν¨μ¬ 짧μ μκ°μ 0 ~ 3κΉμ§ 4λ²μ λ°λ³΅μ κ±°μΉκ² λλ€
for λ°λ³΅λ¬Έμ΄ λλ¬μ λ
μ μ€ν 컨ν μ€νΈ
- GO (i = 4)
- for 컨ν μ€νΈ (empty)
- setTimeout 컨ν μ€νΈ (empty)
- setTimeout 컨ν μ€νΈ (empty)
- setTimeout 컨ν μ€νΈ (empty)
- setTimeout 컨ν μ€νΈ (empty)
- 1μ΄κ° μ§λ ν 3, 4, 5, 6μ setTimeout ν¨μλ iλ λ³μλ₯Ό μ°Έμ‘°ν΄μΌ νλλ° μ체 ν¨μ λ΄λΆμμλ iλ λ³μμ κ°μ μ°Ύμ μ μλ€
- 그리νμ¬ κ³μν΄μ μμ 컨ν μ€νΈλ₯Ό μ°Ύκ² λκ³ , GOμμ λΉλ‘μ λ³μ iμ κ°μ λ°κ²¬νκ² λλ€
- κ²°κ΅ 4λ₯Ό κ±°μ λμμ 4λ² μΆλ ₯νκ² λλ€
π μ΄λ¬ν λ¬Έμ κ° λ°μν μ΄μ
- setTimeout ν¨μ μμ λ³μ iκ° μΈλΆ λ³μμ κ°μ΄ μλκΈ° λλ¬Έμ΄λ€.
- λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μλ setTimeoutμ λ΄λΆ ν¨μλ‘ ν¬ν¨νλ μΈλΆ ν¨μλ₯Ό μ μνκ³ , κ·Έ μΈλΆ ν¨μμ μ§μ λ³μμ κ°μ λ΄λΆ ν¨μμΈ setTimeoutμ λ³μ iκ° μ°Έμ‘°νλλ‘ λ§λ€μ΄μΌ νλ€.
π‘ λ¬Έμ ν΄κ²° ν¬μΈνΈ
- setTimeout ν¨μκ° μ°Έμ‘°νλ iλΌλ λ³μκ° 1μ΄ νμλ λ³ν¨μμ΄ μ μ§λμ΄μΌ νλ€. μ¦, i = 4 (X) / i = 0 ~ 3 (O)
- κ·Έλ¬λ for 컨ν μ€νΈλ iλ₯Ό λ§€μ° λΉ λ₯΄κ² λ³κ²½νκΈ° λλ¬Έμ setTimeoutμ΄ μ€νλλ 1μ΄ λ€κΉμ§ iλ₯Ό μ μ§ν μκ° μλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μλ
μ¦μ μ€ν ν¨μ
λ₯Ό μ΄μ©ν μ μλ€.
ν¨μλ₯Ό μ μΈνλ κ²κ³Ό λμμ μ€ννλ ν¨μ
μ΅λͺ ν¨μλ₯Ό ( )λ‘ κ°μΈμ€ ν 맀κ°λ³μλ₯Ό μ μ΄μ£Όλ©΄ λ΄λΆ ν¨μκ° μ€νλλ€
(function (x) {
console.log(x);
})(5)
μ΄λ₯Ό μ€ν 컨ν μ€νΈ μ μ₯μμ μ΄ν΄λ³΄λ©΄,
- GO (empty)
- μ¦μ μ€ν ν¨μ 컨ν μ€νΈ (x = 5)
console.logλ xλΌλ λ³μλ₯Ό μ°Έμ‘°νλλ° μ΄λ μ¦μ μ€ν ν¨μμμ μ°Ύμ μ μκΈ° λλ¬Έμ λ°λ‘ 5λ₯Ό μΆλ ₯νκ² λλ€.
μ 리νλ©΄, μ¦μ μ€ν ν¨μλ μλ‘μ΄ μ»¨ν
μ€νΈλ₯Ό λ§λ€μ΄μ£Όκ³ , μΈμλ‘ λ°μ κ°(μ΄ κ²½μ° '5')μ 컨ν
μ€νΈμ 'μ μ₯'ν μ μλ€.
μ΄λ₯Ό μμ λ¬Έμ ν΄κ²° ν¬μΈνΈμ μμ©ν μ μλ€.
μ¦, setTimeoutμ΄ μ€νλλ 1μ΄ λ€κΉμ§ iλ₯Ό μ μ§
νκΈ° μν΄
μ¦μ μ€ν ν¨μλ₯Ό λ§λ€κ³ κ·Έ λ΄λΆ ν¨μλ‘ setTimeout ν¨μλ₯Ό μ μ΄μ€ ν
μ¦μ μ€ν ν¨μμ 맀κ°λ³μ μ리μ iλ₯Ό μ μ΄μ£Όλ©΄
for λ°λ³΅λ¬Έμ κ±°μ³ λμ¨ iμ κ°μ μ¦μ μ€ν ν¨μ 컨ν
μ€νΈμ μ μ₯
ν μ μλ€.
μ΅μ’ λ΅μ
for(var i = 0; i < 4; i++) { (function (x) { setTimeout(function () { console.log(x); }, 1000*x); })(i) }
[μν°ν΄ νλ‘μ νΈ 058] μ¦μ μ€ν ν¨μ μ°Έκ³
(function (x) { console.log(x); })(5)
μλ μ μ
((x) => { console.log(x); })(5)
νμ΄ν ν¨μλ‘ λ³ν
function ν€μλ μμ , νμ΄ν μΆκ°
(x => console.log(x))(5)
νμ΄ν μ’μΈ‘, 맀κ°λ³μκ° νλμΌ λ ( ) μλ΅ κ°λ₯
νμ΄ν μ°μΈ‘, ν μ€μ κ°κ²°ν ν¨μλΌλ©΄ { } μλ΅ κ°λ₯ / ;λ κ°μ΄ μλ΅ν΄μΌ ν¨
-(x => console.log(x))(5) +(x => console.log(x))(5) ;(x => console.log(x))(5)
맨 μμ - / + / ; νμ κ°λ₯
π μ΅μ΅μ’ λ΅μ
for (var i = 0; i < 4; i++) { (x => { setTimeout (() => { console.log(x); }, 1000*x); })(i) }
for λ°λ³΅λ¬Έμ΄ λλ¬μ λ
μ μ€ν 컨ν μ€νΈ
- GO (i = 4)
- for 컨ν μ€νΈ (empty)
- μ¦μ μ€ν ν¨μ 컨ν μ€νΈ (i = 0)
- setTimeout 컨ν μ€νΈ (empty)
- μ¦μ μ€ν ν¨μ 컨ν μ€νΈ (i = 1)
- setTimeout 컨ν μ€νΈ (empty)
- μ¦μ μ€ν ν¨μ 컨ν μ€νΈ (i = 2)
- setTimeout 컨ν μ€νΈ (empty)
- μ¦μ μ€ν ν¨μ 컨ν μ€νΈ (i = 3)
- setTimeout 컨ν μ€νΈ (empty)
- 1μ΄κ° μ§λ ν 4, 6, 8, 10μ setTimeout ν¨μλ xλ λ³μλ₯Ό μ°Έμ‘°ν΄μΌ νλλ° μ체 ν¨μ λ΄λΆμμλ xλΌλ λ³μμ κ°μ μ°Ύμ μ μλ€
- 그리νμ¬ μμ 컨ν μ€νΈλ₯Ό μ°Ύκ² λλλ° μ΄ κ²½μ° setTimeout ν¨μλ₯Ό κ°μΈκ³ μλ μ¦μ μ€ν ν¨μμμ xλ λ³μλ₯Ό μ°Ύμ μ μλ€
- μ¦μ μ€ν ν¨μμ xμλ for λ°λ³΅λ¬Έμ κ±°μ³ λμ¨ iμ κ°μ΄ μ μ₯λμ΄ μλ€
- κ²°κ΅ 0, 1, 2, 3μ 1μ΄μ ν λ²μ© μΆλ ₯νκ² λλ€ (β΅ 1000*x)
cf. κ°μ λ¬Έμ λ₯Ό κ°μ§κ³ μλ λ λ€λ₯Έ μμ
var arr = []; for (var i = 0; i < 5; i++) { arr[i] = function () { return i; } } for (var index in arr) { console.log(arr[index]()); // λ¬Έμ λ°μ : 5λ§ 5λ² μΆλ ₯λ¨ }
μ¦μ μ€ν ν¨μ
(& νμ΄ν ν¨μ) μ΄μ©ν΄μ μ½λ μμ var arr = []; for (var i = 0; i < 5; i++) { (x => { arr[x] = () => x; })(i); } for (var index in arr) { console.log(arr[index]()); // λ¬Έμ ν΄κ²° : 0 1 2 3 4 μΆλ ₯λ¨ }
- ννΈ, κΈ°μ‘΄ μ½λμ varμ
let
μΌλ‘ λ°κΏλ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€. letμ λΈλ‘ μ€μ½νλ₯Ό κ°λ μ§μλ³μλ₯Ό μ μΈν λ μ¬μ©λλ ν€μλμ΄λ€.var arr = []; for (let i = 0; i < 5; i++) { // κΈ°μ‘΄ μ½λμμ varμ letμΌλ‘λ§ λ°κΏ¨λ€ arr[i] = function () { return i; } } for (var index in arr) { console.log(arr[index]()); // λ¬Έμ ν΄κ²° : 0 1 2 3 4 μΆλ ₯ }
hoistingμ΄λ μλ‘ λμ΄μ¬λ¦¬λ κ²μ μλ―Ένλ€.
μλ°μ€ν¬λ¦½νΈμμ hoistingμ΄λ λͺ¨λ λ³μ μ μΈλ¬Έμ΄ ν΄λΉ μ½λκ° μν μ€μ½ν λ΄μμ μ΅μμλ‘ λμ΄μ¬λ €μ§ μνλ‘ μ€νλλ κ²μ λ§νλ€.
μ£Όμν μ μ λ³μ μ μΈλ¬Έ'λ§' λμ΄μ¬λ €μ§λ€
λ κ²μ΄λ€. λ³μμ κ°μ ν λΉνλ ꡬ문μ λμ΄μ¬λ €μ§μ§ μλλ€.
var a = 1; function foo () { console.log(a); var a = 2; } foo();
μ΄ κ²½μ°μ μ€μ λ‘ μ½λκ° μ€νλλ νλ¦μ μλμ κ°λ€
var a = 1; function foo () { var a; // λ³μ μ μΈλ¬Έμ΄ κ·Έκ²μ΄ μν μ€μ½νμ μ΅μμλ‘ λμ΄μ¬λ €μ§ console.log(a); a = 2; // λ³μμ κ°μ΄ ν λΉλ ꡬ문μ λμ΄μ¬λ €μ§μ§ μμ } foo();
foo ν¨μ λ΄μμ aλ₯Ό μΆλ ₯ν΄λ¬λΌλ API μ΄μ μ aλΌλ λ³μλ μ μΈλ§ λμ΄ μμ λΏ, λ³μμ κ°μ ν λΉλμ΄ μμ§ μκΈ° λλ¬Έμ console μ°½μλ
undefined
λΌλ κ°μ΄ μΆλ ₯λλ€.
ν¨μ ννμ
μ κ²½μ°,d(); var d = function () { console.log('λ©λ‘±'); }
μ΄ κ²½μ°μ μ€μ λ‘ μ½λκ° μ€νλλ νλ¦μ μλμ κ°λ€
var d; // λ³μ μ μΈλ¬Έμ΄ κ·Έκ²μ΄ μν μ€μ½νμ μ΅μμλ‘ λμ΄μ¬λ €μ§ d(); d = function () { // λ³μμ κ°μ΄ ν λΉλ ꡬ문μ λμ΄μ¬λ €μ§μ§ μμ console.log('λ©λ‘±'); }
λ³μ μ μΈλ¬Έμ΄ μν μ€μ½νκ° μ μ μ€μ½νμ΄λ―λ‘ λ³μ μ μΈλ¬Έμ λͺ¨λ μ½λμ μ΅μμλ‘ λμ΄μ¬λ €μ§λ€. κ·Έλ¬λ μμ§κΉμ§ dλΌλ λ³μλ μ μΈλ§ λμ΄ μμ λΏ, λ³μμ ν¨μκ° ν λΉλμ΄ μμ§λ μκΈ° λλ¬Έμ d();λΌλ ν¨μ μ€νλ¬Έμ λ§λλ©΄ console μ°½μλ d is not a functionμ΄λΌλ
error
κ° λ¨κ² λλ€.
ννΈ,
k(); function k () { console.log('k'); }
ν¨μ μ μΈμ
μΌλ‘ μμ±λ ν¨μλ νμ ν΅μ§Έλ‘ μ΅μμλ‘ λμ΄μ¬λ €μ§κΈ° λλ¬Έμ ν¨μ μ€νλ¬Έμ΄ μ΄λμ μμΉνλ μ€νμλ μ§μ₯μ μ£Όμ§ μλλ€.
μλ°μ€ν¬λ¦½νΈμ λͺ¨λ κ°λ€μ λμ μ리
μ λ°λΌ ν¬κ² primitiveμ referenceλ‘ λλ μ μλ€. ([TIL] 210901 δΈ 'λ°μ΄ν° νμ
' λΆλΆ κ°μ΄ λ³Ό κ²)
κ° μ체
λ₯Ό λ³μμ λ΄μ λλλ€β μμ λΆμ
let a = 10; // aλΌλ λ³μλ₯Ό μ μΈνκ³ , 10μ΄λΌλ κ°μ ν λΉ const b = a; // bλΌλ λ³μλ₯Ό μ μΈνκ³ , a λ³μμ κ°μΈ 10μ ν λΉ a = 30; // a λ³μμ 30μ΄λΌλ κ°μ ν λΉ console.log(b); // b λ³μμ κ°μ κ·Έλλ‘ 10
λ λ²μ§Έ μ€ μ½λμμ λ³μ aμ bμ κ°μ 10μΌλ‘
κ°λ€
μμΉ κ°
μ λ³μμ λ΄μ λλλ€β μμ λΆμ 1
const list1 = [1, 2, 3]; const list2 = [1, 2, 3]; const result = list1 === lest2; console.log(result); // false
λ³μλ₯Ό μ μΈνκ³ , κ·Έ κ°μΌλ‘ λ°°μ΄μ ν λΉν΄μ€λ€. μ΄λ λ©λͺ¨λ¦¬μλ λ°°μ΄ μ λ³΄κ° μ μ₯λκ³ , λ³μμλ κ·Έ λ©λͺ¨λ¦¬μ μμΉ κ°μ΄ λ΄κΈ°κ² λλ€.
μ¦, μ²μ μλ‘ λ§λ λ°°μ΄μ λ©λͺ¨λ¦¬μ ν λΉνκ³ κ·Έ μμΉκ°μ list1μ΄λΌκ³ ν ν λ€μ λ μλ‘ λ§λ λ°°μ΄μ λ©λͺ¨λ¦¬μ ν λΉνκ³ κ·Έ μμΉκ°μ list2λΌκ³ ν΄μ€ κ²μ΄λ€. λ°λΌμ list1μ΄λΌλ μμΉκ°κ³Ό list2λΌλ
λ€λ₯΄λ€.
μμ λΆμ 2
const list1 = [1, 2, 3]; const list2 = list1; // μλ‘μ΄ λ°°μ΄μ λ§λ κ²μ΄ μλλΌ list1 λ³μμ μμΉ κ°μ list2 λ³μμ ν λΉν΄μ€ κ² const result = list1 === list2; console.log(result); // true
μμ λΆμ 3
var updateAge = function () { this.age++; }; var son = { age : 3, growUp : updateAge }; var daughter = { age : 7, growUp : updateAge } var mother = { age : 38, growUp : updateAge, children : [son, daughter] }; var father = { age : 38, growUp : updateAge, wife : mother, children : [son, daughter] }; // 1λ² if (father.growUp === son.growUp) { console.log('μ€μ'); } // 2λ² if (father.children === mother.children) { console.log('μμ°'); }
1λ² μ€λͺ
father κ°μ²΄μ growUp μμ±μ λ³μ updateAgeλΌλ κ°μ κ°μ§λ€. λ³μ updateAgeμλ
ν¨μ
κ° ν λΉλμ΄ μλ€. ν¨μλ μ°Έμ‘° λ°©μμΌλ‘ λμνλ―λ‘ λ³μ updateAgeμλ λ©λͺ¨λ¦¬μ μμΉ κ°μ΄ λ΄κΈ°κ² λλ€. mother κ°μ²΄μ growUp μμ±μ κ°λ λ³μ updateAgeμ΄λ―λ‘ κ°μ μμΉ κ°μ΄ λ΄κΈ°κ² λλ€. λ°λΌμ if 쑰건μ λ§μ‘±νλ―λ‘ console μ°½μλ μ€μκ° μΆλ ₯λλ€.
2λ² μ€λͺ
father κ°μ²΄μ children μμ±μ
λ°°μ΄
μ κ°μΌλ‘ κ°μ§λ€. λ°°μ΄μ μ°Έμ‘° λ°©μμΌλ‘ λμνλ―λ‘ father.childrenμλ κ·Έ λ°°μ΄μ΄ μ μ₯λ λ©λͺ¨λ¦¬μ μμΉ κ°μ΄ ν λΉλλ€. mother κ°μ²΄μ children μμ± λν μλ‘μ΄ λ°°μ΄μ κ°μΌλ‘ κ°μ§λ―λ‘ mother.childrenμλ μλ‘μ΄ λ°°μ΄μ΄ μ μ₯λ λ©λͺ¨λ¦¬μ μμΉ κ°μ΄ ν λΉλλ€. μ¦, μλ‘μ΄ λ°°μ΄μ 2λ² λ§λ€μμΌλ―λ‘ κ·Έ μμΉ κ° λν μλ‘ λ€λ₯΄κ² λλ€. λ°λΌμ if 쑰건μ λΆλ§μ‘±νλ―λ‘ console μ°½μλ μλ¬΄λ° κ°λ λ¨μ§ μλλ€.
Reference μΆκ° 곡λΆ
JavaScript Koans