Appendix A: Exploring Further_ - hochan222/Everything-in-JavaScript GitHub Wiki
λ²μλ λλλ‘ λͺ ννμ§ μμ μ₯μμμ μμ±λλ€. μ€μ λ‘ μ΄λ¬ν 묡μμ λ²μλ νλ‘κ·Έλ¨ λμμ μμ£Ό μν₯μ μ£Όμ§μμ§λ§ μ΄λ¬ν λ¬Έμ κ° λ°μνκ³ μμμ μλ κ²μ μ¬μ ν ββμ μ©νλ€.
β’ Parameter scope
β’ Function name scope
// outer/global scope: RED(1)
function getStudentName(studentID) {
// function scope: BLUE(2)
// ..
}
ν¨μμ νλΌλ―Έν°μ ν¨μμ μ§μ λ³μ λ²μκ° κ°λ€κ³ μΈμλμ§λ§ νμ μ°Έμ μλλ€. λ¨μ 맀κ°λ³μλ μ§μ λ³μ λ²μμ κ°μ μ μμ§λ§, λ¨μ 맀κ°λ³μκ° μλ μ΄κΈ°ν κ°μ ν¬ν¨νκ±°λ ...
λ±μ΄ μμΌλ©΄ λ€λ₯΄λ€.
// outer/global scope: RED(1)
function getStudentName(/*BLUE(2)*/ studentID = 0) {
// function scope: GREEN(3)
// ..
}
맀κ°λ³μ λ²μλ μ체 λ²μλ₯Ό κ°κ³ ν¨μμ λ²μλ 맀κ°λ³μ λ²μλ₯Ό ν¬ν¨ν μ€μ²© λ²μλ₯Ό κ°λλ€.
function getStudentName(studentID = maxID, maxID) {
// ..
}
μμ κ°μ ν¨μλ TDZ μ€λ₯κ° λ°μνλ€. maxIDλ μ μΈμ λμ§λ§ μ΄κΈ°νκ° λμ§ μμκΈ° λλ¬Έμ΄λ€. studentID = maxIDμμ maxIDλ μ μΈκ³Ό μ΄κΈ°ν λλ€ λμ΄μμ΄μΌ νλ€.
function getStudentName(maxID, studentID = maxID) {
// ..
}
μμλ₯Ό λ°κΎΈλ©΄ μ€λ₯κ° μ¬λΌμ§λ€.
맀κ°λ³μ μμ ν¨μ ννμμ΄ μμ κ²½μ° λ 볡μ‘ν΄μ§λ€. μ체 ν΄λ‘μ λ₯Ό λ§λ λ€.
function whatsTheDealHere(id, defaultID = () => id) {
id = 5;
console.log( defaultID() );
}
whatsTheDealHere(3);
// 5
ν¨μ ννμμ΄ λλλ€μ id = 5κ° μ¬ν λΉ λ κ²μ λ³Ό μ μλ€.
function whatsTheDealHere(id, defaultID = () => id) {
var id = 5;
console.log( defaultID() );
}
whatsTheDealHere(3);
// 3
id κ° var id = 5λ‘ μΈν΄ μλμμ΄ μΌμ΄λκ³ μλ κ²μ λ³Ό μ μκ³ , λ€λ₯Έ λ²μλ₯Ό νμ±νλ κ²μ λ³Ό μ μλ€.
λ€μμ λ μ΄μν΄μ§λ€.
function whatsTheDealHere(id, defaultID = () => id) {
var id;
console.log(`local variable 'id': ${ id }`);
console.log(`parameter 'id' (closure): ${ defaultID() }` );
console.log("reassigning 'id' to 5");
id = 5;
console.log(`local variable 'id': ${ id }`);
console.log(`parameter 'id' (closure): ${ defaultID() }` );
}
whatsTheDealHere(3);
// local variable 'id': 3 <--- ????? // parameter 'id' (closure): 3
// reassigning 'id' to 5
// local variable 'id': 5
// parameter 'id' (closure): 3
μλμ λ³μλ λ³΄ν΅ undefinedλ‘ μ΄κΈ°ν λλλ° μ.. local variable 'id': 3κ° λμμκΉ..
νΈν μ΄μ λ‘ μλ°μ€ν¬λ¦½νΈ μ€νμμλ idλ₯Ό undefinedλ‘ μ΄κΈ°ννμ§ μλλ€. λμ parameter κ°μΌλ‘ μ΄κΈ°ν νλ€. κ·Έλ¦¬κ³ λ idλ λ
립λ λ²μλ₯Ό νμ±νλ€.
5κ° ν λΉλ μ΄νμλ 맀κ°λ³μλ idλ 3μ κ°μ μ§μ λ³μλ idλ 5μ κ°μ κ°λλ€.
λ°λΌμ, μ°λ¦¬λ μ‘°μ¬ν νμκ° μλ€. νλΌλ―Έν°λ₯Ό μ§μ λ³μλ‘ μλμ νμ§λ§μ.
μμμ ν¨μ ννμμ μ΄λ¦ μλ³μλ μΈλΆ λ° λ΄λΆ κΈ°λ³Έ ν¨μ λ²μ μ¬μ΄μ μ€μ²© λ λ²μλ₯Ό ν¬ν¨νλ μμμ λ²μμ μλ€κ³ λ€λ€λ€.
var askQuestion = function ofTheTeacher(){
// why is this not a duplicate declaration error?
let ofTheTeacher = "Confused, yet?";
};
letμ μ¬μ μΈμ νμ©νμ§ μλλ€. μ΄λ‘μ¨ λμ λ€λ₯Έ λ²μμ μλκ²μ μ μ μλ€. λ°λΌμ, μλμμ μΌμΌν¬ μ μλ ν¨μ μλ³μλ μ°μ§λ§μ.
νλ‘κ·Έλ¨μ λͺ¨λ ν¨μλ λͺ©μ μ κ°μ§κ³ μλ€. λͺ©μ μ΄ μμΌλ©΄ ν¨μ λ°μΌλ‘ κΊΌλ΄λΌ. κ·Έκ²μ λ©λͺ¨λ¦¬ μ°¨μ§λ§ νκ³ μμ λΏμ΄λ€.
μ΅λͺ ν¨μλ μ€νμΆμ μ λνλμ§ μμ λλ²κΉ μ λμμ΄ μλλ€. μλλ₯Ό λΉκ΅ν΄ 보μλΌ.
btn.addEventListener("click",function(){
setTimeout(function(){
["a",42].map(function(v){
console.log(v.toUpperCase());
});
},100);
});
// Uncaught TypeError: v.toUpperCase is not a function
// at myProgram.js:4
// at Array.map (<anonymous>)
// at myProgram.js:3
btn.addEventListener("click",function onClick(){
setTimeout(function waitAMoment(){
["a",42].map(function allUpper(v){
console.log(v.toUpperCase());
});
},100);
});
// Uncaught TypeError: v.toUpperCase is not a function
// at allUpper (myProgram.js:4)
// at Array.map (<anonymous>)
// at waitAMoment (myProgram.js:3)
ν¨μμ μ΄λ¦μ μ¬μ©ν΄μΌ λλ²κΉ μ΄ μ½λ€. λν λ js μμ§μμ Array.mapμ ꡬνμ΄ μμμ 보μ¬μ€λ€.
μ΄λ¦ μλ ν¨μμ μ΄λ¦ μλ ν¨μκ° μλ€.
function thisIsNamed() { // ..
}
makeRequest({
data: 42,
cb /* also not a name */: function(){
// ..
}
});
μλ κ²½μ°λ μ΄λ€ κ²½μ°μΈκ°?
var notNamed = function(){
// ..
};
var config = {
cb: function(){
// ..
}
};
notNamed.name;
// notNamed
config.cb.name;
// cb
μ°λ¦¬λ μ΄κ²λ€μ μΆλ‘ μ΄λ¦(inferred name)μ΄λΌ λΆλ₯Έλ€. μ΄λ² λ¨μμμλ λ Όμμ ν¬ν¨λμ΄μμ§ μμ§λ§ μ΄λ¦ ν¨μμ λΉμ·νλ€.
λͺ¨λ κ²½μ°μ μ΅λͺ λ³΄λ€ μ΄λ¦μλ ν¨μκ° μ’μ 보μΈλ€. μ°λ¦¬ μκ°λ³΄λ€ μ΄λ¦ μλ ν¨μλ μλνμ§ μλν λλΆλΆμ΄ μ΅λͺ ν¨μμμ μ μ μλ€. λ€μ κ²½μ°λ₯Ό 보μ.
function ajax(url,cb) {
console.log(cb.name);
}
ajax("some.url",function(){
// ..
});
// ""
λ³΄ν΅ μ½λ°±μΌλ‘ λ€μ΄μ€λ ν¨μλ μ΄λ¦μ΄ μλ€.
μ½λ°± ν¨μ λ§κ³ λ λ€μ κ²½μ°μλ ν΄λΉλλ€.
var config = {};
config.cb = function(){
// ..
};
config.cb.name;
// ""
var [ noName ] = [ function(){} ];
noName.name
// ""
ν¨μμμ μ΄λ¦ ν λΉλ λλΆλΆ μ€ν¨νλ€.
μ΄λ¦μ΄ μμΌλ©΄ μ¬κ·, μ¬ν λΉμ΄ λΆκ°λ₯νλ€.
// broken
runOperation(function(num){
if (num <= 1) return 1;
return num * oopsNoNameToCall(num - 1);
});
// also broken
btn.addEventListener("click",function(){
console.log("should only respond to one click!");
btn.removeEventListener("click",oopsNoNameHere);
});
λν μ΄λ¦μ ν¨μμ λͺ©μ μ΄ λ¬΄μΈμΈμ§ μ€λͺ νλ μ§νμ΄κΈ°λ νλ€.
[ 1, 2, 3, 4, 5 ].filter(function(v){ return v % 2 == 1;
});
// [ 1, 3, 5 ]
[ 1, 2, 3, 4, 5 ].filter(function keepOnlyOdds(v){ return v % 2 == 1;
});
// [ 1, 3, 5 ]
νμ΄ν ν¨μλ μΆλ‘ λ μ΄λ¦μ μ 곡νλ λ°©μμΌλ‘ μ¬μ© λλλΌλ νμ μ΅λͺ μ΄λ€. νμ΄ν ν¨μλ var self = thisλ bind(this)μ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μ€κ³λμλ€. νμ§λ§, μ°λ¦¬λ λ€μμ λ¬Έλ²μ κ°μ λ₯Ό ν΅ν΄ λ¬Έμ λ₯Ό ν΄κ²°νμ§λ§ μ΅λͺ ν¨μμ λ¨μ λ κ°λλ€λ κ²μ νμ μΈμ§ν΄μΌνλ€.
λͺ¨λ ν¨μμλ μ΄λ¦μ΄ νμνλ€. μ΄λ IIFEλ λ€λ₯΄μ§ μλ€.
(function(){
// don't do this!
})();
(function doThisInstead(){
// ..
})();
μ°λ¦¬κ° function μ μΈ κ΅¬λ¬ΈμΌλ‘ JS parserκ° ν΄μνλκ±Έ νΌνκΈ°μν΄ (...)()μ μ°λλ°, IIFEλ₯Ό μ μνλ λ°©λ²μ (...)()λ§ μλ건 μλλ€.
!function thisIsAnIIFE(){
// ..
}();
+function soIsThisOne(){
// ..
}();
~function andThisOneToo(){
// ..
}();
μ°λ¦¬λ !, +, βΌ μ λͺκ°μ§ λ¨ν μ°μ°μλ₯Ό λ°°μΉν΄ ννμμΌλ‘ λ°κΏ μ μλ€. voidλ₯Ό ν¨μ μμ λΆμ΄λ κ²½μ°μ λΉμ·νλ€.
void function yepItsAnIIFE() {
// ..
}();
voidμ μ΄μ μ ν¨μμ μμ λΆλΆμ μ΄ iifeκ° μ΄λ€ κ°λ λ°ννμ§ μμ κ²μμ λͺ ννκ² μ λ¬νλ€λ κ²μ΄λ€.
μ€... (function...)(); λ§κ΅¬ void function(); μ μ¨μΌκ² κ΅°...
μ λ΄μ©μμ μλ νλ‘κ·Έλ¨μ νΈμ΄μ€ν λλΆμ μλ νλ κ²μ μ μ μμλ€.
getStudents();
// ..
function getStudents() {
// ..
}
ν¨μ μ μΈμ μ»΄νμΌ μ€μ νμλλ€. getStudentsλ μ 체 λ²μμ λν΄ μ μΈ λ μλ³μμ΄κ³ , getStudents μλ³μλ λ€μ λ²μμ μμ λΆλΆμμ ν¨μ μ°Έμ‘°λ‘ μ΄κΈ°νλλ€.
getStudents();
// *************
function getStudents() {
var whatever = doSomething();
// other stuff
return whatever;
// *************
function doSomething() {
// ..
}
}
ν¨μ νΈμ΄μ€ν μ λν κ°λ μ±μ λμ¬μ€λ€.
pleaseDontDoThis = "bad idea";
// much later
var pleaseDontDoThis;
μμ μμλ§ λ³΄λλΌλ Variable Hoistingμ΄ μΌλ§λ μμ’μ λ¬Έλ²μΈμ§ μ μ μλ€.
ν¨μ νΈμ΄μ€ν
μμλ μ’μμ§λ§, μΌλ°μ μΌλ‘ λ³μμμ μΆλ‘ νκΈ°μλ μ΄λ €μ 보μΈλ€.
constλ λ³κ²½ ν μμλ κ°μ λ§λλ μ²νλ€. νμ§λ§, μ€μ λ‘λ μ¬ν λΉμ λ°©μ§νλ κ²μ΄λ€.
const studentIDs = [ 14, 73, 112 ];
studentIDs.push(6); // whoa, wait... what!?
μ¬ν λΉ λ¬Έμ λ μμμΌλλ§ constλ₯Ό μ¬μ©νμ.
λ€μ ν λΉλμ§ μλ let (λλ var)μ μ»΄νμΌλ¬ 보μ¦μ΄ μλλΌλ μ΄λ―Έ "μμ"λ‘ λμνλ€. μ΄κ²λ€λ‘ μ΄λ―Έ μΆ©λΆνλ€.
letκ³Ό varμ μ μ ν μ¬μ©νμ. ν¨μμ μμ, μ€κ° λλ λμ κ΄κ³μμ΄ νμ λͺ¨λ κΈ°λ₯μ μ΅μμ λ²μμμ varλ₯Ό μ¬μ©νμ. letμ μ§μνλ λ²μλ₯Ό varμ ν¨μ μ 체λ²μλ₯Ό λνλ΄λλ° μ¬μ©νμ.
{
// what should print here?
console.log(studentName);
// later
const studentName = "Frank";
// ..
}
μ΄κΈ° ES6 κ°λ° μμ μ€μ TC39λ const(λ° let)μ λμμ varμ²λΌ νΈμ΄μ€ν λκ² λ§λ€κΉ μκ°μ νλ€. κ·Έλ¬λ μ μ½λμμ κ·Έλ΄κ²½μ° constλ μμ κ°μΈλ° λ‘μ§μ λΆνΈνκ±°λ coolνμ§ λͺ»ν¨μ μ μ μλ€. λν, undefined λ‘ μλ μ΄κΈ°ν νμ§ μλ μ΄μ λ μμκ°μΈλ° λκ°μ§ μνλ₯Ό κ°λλ€λ κ² μμ²΄κ° μ΄μνκΈ° λλ¬Έμ΄λ€. λ°λΌμ κ·Έλ€μ μ μΈ μκ°κ³Ό ν λΉμκ°μ μ μνκ² λκ³ TDZκ° λ§λ€μ΄μ‘λ€.
- ν΄λ‘μ λ ν¨μκ° λ€λ₯Έ λ²μμμ μ λ¬λκ³ νΈμΆλλ κ²½μ°μλ μΈλΆ λ³μλ₯Ό κΈ°μ΅νλ ν¨μ μΈμ€ν΄μ€μ΄λ€.
define([ "./Student" ],function StudentList(Student){
var elems = [];
return {
renderList() {
// ..
}
}
});