SEB FE / Section1 / Unit9 / JavaScript ν΅μ¬ κ°λ κ³Ό μ£Όμ λ¬Έλ²
π Today I Learned
- μμ μλ£νκ³Ό μ°Έμ‘° μλ£ν
- μ€μ½ν
- ν΄λ‘μ
stackμ΄λΌλ μ¬λ¬Όν¨ μμ κ°μ ν λΉνκ³ , μ¬μ© μμ μ¬λ¬Όν¨μμ μ΄λ¦νλ₯Ό μ°Ύμ κ°μ λ°ννλ€
number
string
boolean
null
undefined
let a;
a = 1;
a; // 1
let b = 2;
let c = 3;
κ° λ³μ κ°μ μμ νμ λ°μ΄ν°λ₯Ό 볡μ¬ν κ²½μ° λ°μ΄ν°κ°μ΄ 볡μ¬λκΈ° λλ¬Έμ κΈ°μ‘΄μ λ°μ΄ν°μ μν₯μ΄ κ°μ§ μλλ€.
const num1 = 123;
const num2 = 123456789;
μ΄λ κ² λ³μμλ λ°μ΄ν°μ ν¬κΈ°μλ κ΄κ³μμ΄ νλμ λ°μ΄ν°λ§ λ΄μ μ μλ€.
μμ μλ£νμ κ° μ체μ λν λ³κ²½μ΄ λΆκ°λ₯(immutable)
νμ§λ§, λ³μμ λ€λ₯Έ λ°μ΄ν°λ₯Ό ν λΉν μλ μλ€.
"hello world!"
"hello codestates!"
// "hello world!" μ "hello codestates!"λ λͺ¨λ λ³κ²½ν μ μλ κ³ μ λ κ°μ΄λ€.
let word = "hello world!"
word = "hello codestates!"
// νμ§λ§, wordλΌλ λ³μμ μ¬ν λΉμ νμ¬ λ³μμ λ΄κΈ΄ λ΄μ©μ λ³κ²½νλ κ²μ κ°λ₯νλ€.
const num1 = 123;
num1 = 123456789; // μλ¬ λ°μ
// const ν€μλλ‘ μ μΈνλ©΄, μ¬ν λΉμ λΆκ°νλ€.
heap
μ΄λΌλ λΉ κ³΅κ°μ λ§λ€κ³ μ¬λ¬Όν¨μ μ΄λ¦νλ₯Ό λ¨λ€. κ° λμ μ£Όμλ₯Ό λ¬κ³ , μ£Όμλ heapμ μ°κ²°λμ΄ μλ€. κ°μ μ°Ύμ λ μ¬λ¬Όν¨ μμ μ£Όμλ₯Ό λ³΄κ³ heapμμ μ°Ύμ λ°ννλ€.
array
function
object
let a = [4, 5, 6];
let b = ["a", 1, 2];
let c = [true, false];
b.pop();
a[0] = 3;
c.pusg("a");
λ°°μ΄λ€μ μμλ₯Ό λΉΌλ΄κ±°λ μμ μ ν΄λ κ°μ μ°Ύμ λ 볡μ‘ν΄μ§μ§ μλλ€.
μ£Όμλ₯Ό 볡μ¬νκΈ° λλ¬Έμ 볡μ¬ν λ°μ΄ν°μμ μμλ₯Ό λ³κ²½νκ² λλ€λ©΄ μ£Όμ μμ λ°μ΄ν°κ° λ³κ²½λκΈ° λλ¬Έμ κΈ°μ‘΄μ λ°μ΄ν°μλ μν₯μ΄ κ°κ² λλ€.
- μμ μλ£νμ΄ ν λΉλ λμλ λ³μμ κ°(value) μμ²΄κ° λ΄κΈ°κ³ , μ°Έμ‘° μλ£νμ΄ ν λΉλ λλ 보κ΄ν¨μ μ£Όμ(reference)κ° λ΄κΉλλ€.
- κ·Έλμ μ°Έμ‘° μλ£νμ κΈ°μ‘΄μ κ³ μ λ ν¬κΈ°μ 보κ΄ν¨μ΄ μλλΌ, λμ μΌλ‘ ν¬κΈ°κ° λ³νλ νΉλ³ν 보κ΄ν¨μ μ¬μ©ν μ μμ΅λλ€.
μ€μ½νλ "λ³μ μ κ·Ό κ·μΉμ λ°λ₯Έ μ ν¨ λ²μ"μ΄λ€.
λ³μκ° μ κ·Όν μ μλ λ²μκ° μ‘΄μ¬νλ€.
μ€κ΄νΈ(λΈλ‘) μμͺ½μ λ³μκ° μ μΈλμλκ°, λ°κΉ₯μͺ½μ λ³μκ° μ μΈλμλκ°κ° μ€μνλ€.
μ΄ λ²μλ₯Ό μ°λ¦¬λ μ€μ½νλΌκ³ λΆλ₯Έλ€.
λ°κΉ₯μͺ½ μ€μ½νμμ μ μΈν λ³μλ μμͺ½ μ€μ½νμμ μ¬μ© κ°λ₯νλ€.
λ°λ©΄μ, μμͺ½μμ μ μΈν λ³μλ λ°κΉ₯μͺ½ μ€μ½νμμλ μ¬μ©ν μ μλ€.
μ€μ½νλ μ€μ²©μ΄ κ°λ₯νλ€. λ§μΉ μ€μ²©λ μΈν리μ κ°λ€.
λ°κΉ₯μͺ½μ μ€μ½νλ μ μ μ€μ½ν(Global Scope)
λΌκ³ λΆλ₯Έλ€.
μ μμ λ°λλ§μ μ§μ(local)
μΌλ‘ μ μμ΄ μλ λ€λ₯Έ μ€μ½νλ μ λΆ μ§μ μ€μ½ν(local scope)
μ΄λ€.
λμΌν λ³μ μ΄λ¦μΌλ‘ μΈν΄ λ°κΉ₯μͺ½ λ³μκ° μμͺ½ λ³μμ μν΄ κ°λ €μ§λ(shadow) μ΄λ¬ν νμμ μλμ(variable shadowing)
μ΄λΌκ³ λΆλ¦
λλ€.
block scope λΈλ‘ μ€μ½ν
function scope ν¨μ μ€μ½ν
block scope λΈλ‘ μ€μ½ν (νμ΄ν ν¨μλ‘ λλ¬μΌ λ²μ)
window
κ°μ²΄μ μνκ² λλ€window
λΌλ κ°μ²΄κ° μ‘΄μ¬νλ€.var myName = 'κΉλ¬';
console.log(window.myName);
// κΉλ¬
function foo() {
console.log('bar');
}
console.log(foo === window.foo);
// true
λΆμ ν¨κ³Ό(side effect)
λ°μfunction showAge() {
age = 90; // ageλ μ μ λ³μλ‘ μ·¨κΈ λλ€.
console.log(age); // 90
}
showAge();
console.log(age); // 90
console.log(window.age); // 90
ageλ μ μΈν μ μμΌλ, κ°μ ν λΉνλ©΄μ λ§μΉ varλ‘ μ μΈλ μ μ λ³μμ²λΌ μλνλ€.
strict mode
λ₯Ό μ¬μ©ν μλ μλ€.'use strict'
function showAge() {
age = 90; // μ¬κΈ°μ μλ¬κ° λ°μνλ€
console.log(age); // 90
}
showAge();
ν΄λ‘μ λ "ν¨μμ ν¨μκ° μ μΈλ μ΄νμ (lexical) νκ²½μ μ‘°ν©μ λ§ν©λλ€. μ΄ νκ²½μ ν΄λ‘μ κ° μμ±λ μμ μ μ ν¨ λ²μ λ΄μ μλ λͺ¨λ μ§μ λ³μλ‘ κ΅¬μ±λλ€." λΌκ³ ν©λλ€.
μ¬κΈ°μμ ν€μλλ "ν¨μκ° μ μΈ"λ "μ΄νμ (lexical) νκ²½"μ λλ€.
const adder = x => y => x + y;
adder(5)97); // 12
typeof adder(5) // 'function' // λ¦¬ν΄ κ°μ΄ ν¨μμ ννλ€.
adder(5) // y => x + y // λ¦¬ν΄ κ°μ΄ ν¨μμ ννλ€.
ν΄λ‘μ ν¨μμ κΈ°λ³Έ νν
// const adder = x => y => x + y;
// μμ μ½λμ λμΌνκ² μλνλ μ½λ
const adder = function (x) {
return function (y) { // λ¦¬ν΄ κ°μ΄ ν¨μμ ννλ€.
return x + y;
}
}
xκ° μ μΈλ ν¨μλ λ°κΉ₯μͺ½μ μμΌλ μΈλΆ ν¨μ
λΌκ³ λΆλ₯Έλ€.
κ·Έλ¦¬κ³ yκ° μ μΈλ ν¨μλ λ³΄λ€ μμͺ½μ μμΌλ λ΄λΆ ν¨μ
λΌκ³ λΆλ₯Έλ€.
μ΄ ν΄λ‘μ ν¨μλ μ€μ½νκ° λΆλ¦¬λμ΄ μλ€.
HTML λ¬Έμμ΄ μμ±κΈ°
const tagMaker = tag => content => `<${tag}>${content}</${tag}>`
const divMaker = tagMaker('div');
divMaker('hello') // '<div>hello<div>'
divMaket('world') // '<div>world<div>'
const anchorMaker = tagMarker('a');
anchorMaker('go') // '<a>go</a>'
anchorMaker('study') // '<a>study</a>'
μμ μμ divMaker
ν¨μλ 'div'λΌλ λ¬Έμμ΄μ tag
λΌλ λ³μμ λ΄μλκ³ μμΌλ©°, anchorMaker
ν¨μλ 'a'λΌλ λ¬Έμμ΄μ tag
μ λ΄μλκ³ μλ€.
ν΄λ‘μ λ μ΄μ²λΌ νΉμ λ°μ΄ν°λ₯Ό μ€μ½ν μμ κ°λμ΄ λ μ±λ‘ κ³μ μ¬μ©ν μ μκ² ν΄ μ€λ€.
ν΄λ‘μ λ₯Ό μ΄μ©ν΄ λ΄λΆ ν¨μλ₯Ό λ¨ νλλ§ λ¦¬ν΄νλ κ²μ κ·ΈμΉμ§ μκ³ , κ°μ²΄μ λ΄μ μ¬λ¬ κ°μ λ΄λΆ ν¨μλ₯Ό 리ν΄νλλ‘ λ§λ λ€.
μ 보μ μ κ·Ό μ ν (μΊ‘μν)
λ§μΌ μ€μ½νλ‘ value κ°μ κ°μΈμ§ μμλλΌλ©΄, value κ°μ μ μ λ³μμ¬μΌλ§ νμ κ²μ΄λ€. νμ§λ§ makeCounterλΌλ ν¨μκ° value κ°μ 보쑴νκ³ μκΈ° λλ¬Έμ, μ μ λ³μλ‘ λ°λ‘ λ§λ€ νμκ° μλ€.
μ μ λ³μκ° μ’μ§ μμ μ΄μ λ, μ μ λ³μλ λ€λ₯Έ ν¨μ νΉμ λ‘μ§ λ±μ μν΄ μλλμ§ μμ λ³κ²½μ μ΄λνκΈ° λλ¬Έμ΄λ€. μ΄λ₯Ό side effectλΌκ³ ν©λλ€. side effectλ₯Ό μ΅μννλ©΄, μλλμ§ μμ λ³κ²½μ μ€μΌ μ μλ€. λ°λΌμ μ΄μ λ°λ₯Έ μ€λ₯λ‘λΆν° λ³΄λ€ μμ νκ² κ°μ 보νΈν μ μλ€.
ν΄λ‘μ λ₯Ό ν΅ν΄ λΆνμν μ μ λ³μ μ¬μ©μ μ€μ΄κ³ , μ€μ½νλ₯Ό μ΄μ©ν΄ κ°μ λ³΄λ€ μμ νκ² λ€λ£° μ μλ€.
μ¬νμ©μ΄ κ°λ₯ν makeCounerν¨μ
μ¬λ¬ κ°μ counterλ₯Ό λ§λλ κ²μ΄ κ°λ₯
const makeCounter = () => {
let value = 0;
return {
increase: () => {
value = value + 1
},
decrease: () => {
value = value - 1
},
getValue: () => value
}
}
const counter1 = makeCounter();
counter1.increase();
counter1.increase();
counter1.decrease();
counter1.getValue(); // 1
const counter2 = makeCounter();
counter1.decrease();
counter1.decrease();
counter1.decrease();
counter1.getValue(); // -3
// counter1κ³Ό counter2μ valueλ μλ‘μκ² μν₯μ λΌμΉμ§ μλλ€.
makeCounterμ μν΄ λ¦¬ν΄λ κ°μ²΄λ, makeCounterλ₯Ό μ€νν λμ μ μΈλλ value κ°μ κ°μ λ 립μ μΌλ‘ κ°μ§κ² λλ€. λ°λΌμ counter1μμμ valueμ counter2μμμ valueλ μλ‘μκ² μν₯μ λΌμΉμ§ μκ³ , κ°κ°μ κ°μ 보쑴ν μ μλ€.
μ΄μ κ°μ΄ ν¨μ μ¬μ¬μ©μ±μ κ·Ήλννμ¬, ν¨μ νλλ₯Ό μμ ν λ 립μ μΈ λΆν ννλ‘ λΆλ¦¬νλ κ²μ λͺ¨λνλΌκ³ νλ€.
ν΄λ‘μ λ₯Ό ν΅ν΄ λ°μ΄ν°μ λ©μλλ₯Ό κ°μ΄ λ¬Άμ΄μ λ€λ£° μ μλ€. μ¦, ν΄λ‘μ λ λͺ¨λνμ μ 리νλ€.
βν΄λ‘μ λͺ¨λ ν¨ν΄βμ μμμ λλ€. λ³μ valueλ μ§μ μμ νλ κ²μ΄ λΆκ°λ₯νκ³ , 리ν΄νλ κ°μ²΄κ° μ 곡νλ λ©μλλ₯Ό ν΅ν΄μλ§ μ‘°μμ΄ κ°λ₯ν©λλ€. μ΄λ κ² μΊ‘μνλ₯Ό ν¨μΌλ‘μ¨ λ³μ valueλ₯Ό makeCounter ν¨μλ‘ λ³΄μ‘΄ν΄μ μ μ λ³μλ‘ μΈν side effectλ₯Ό λ°©μ§ν μ μμ΅λλ€.