β¨ console.log(this) μ κ²°κ³Ό
μ΄μ μ μ 리ν΄λμλ μλ°μ€ν¬λ¦½νΈ(μ΄ν JS)μ this μμ μ£Όμμ¬νμΌλ‘ μΈκΈνλ―, λΈλΌμ°μ μμ μ€νλλ JS μ this μ node μμ μ€νλλ JS μ this λ λ€λ₯΄λ€.
λΈλΌμ°μ μ μ μκ°μ²΄λ window μ΄λ€. λ°λΌμ μ μ scope μμ console.log(this) λ₯Ό μ λ ₯ν κ²½μ° window κ° λ¨λ κ²μ΄ λ§λ€.
console.log(this) // window
νμ§λ§ λμΌν μ½λλ₯Ό node νκ²½μμ μ€ννλ©΄ μ΄λ€ κ²°κ³Όκ° λμ¬κΉ? κ²°κ³Όλ λ€μκ³Ό κ°λ€.
console.log(this) // {}
κ°μ μ½λλ₯Ό μ³€λλ°, μ λ
Έλμμλ λΉ κ°μ²΄κ° λμ¬κΉ? κ·Έ μ΄μ λ₯Ό μμΈν ν λ² μμ보λλ‘ νκ² λ€.
β¨ JS λ°νμμ μ’ λ₯μ μ°¨μ΄
μμ μΈκΈνλ―, node μμμ this λ λΉ κ°μ²΄μ΄λ€. λΉ κ°μ²΄κ° λμ€λ μ΄μ λ λ¨μν λ§νλ©΄ JSμ "λ°νμ νκ²½μ΄ λ¬λΌμ" μ΄λ€.
μ‘°κΈ νΌλμ€λ¬μΈ μ μμΌλ, JS λ°νμμ κ°λ
κ³Ό μ’
λ₯λ₯Ό κ°λ΅ν μ§κ³ λμ΄κ°κ² λ€.
λ°νμ νκ²½μ΄λ νλ‘κ·Έλ¨μ΄ μ€νλλ κ³³μ΄λ€. μ€μν μ μ, λ°νμ νκ²½μ΄ λ°λ‘ νλ‘κ·Έλ¨μ΄ μ κ·Όν μ μλ μ μ κ°μ²΄μ μλ λ°©μμ κ²°μ νλ€λ μ¬μ€μ΄λ€. λνμ μΈ JS λ°νμμ λΈλΌμ°μ μ Node λ κ°κ° μλ€.
π λΈλΌμ°μ (Chrome, Firefox λ±)
- JS κ° μ€νλλ κ°μ₯ 보νΈμ μΈ λ°νμ νκ²½μ΄λ€.
- λΈλΌμ°μ μλ window λΌλ μ μκ°μ²΄κ° λ΄μ₯λμ΄ μμ΄, JS script λ₯Ό ν΅ν΄ window μ κ΄λ ¨λ λ©μλλ₯Ό μ€νν μ μλ€. (μμ: window.alert())
π Node
- λΈλΌμ°μ μμ΄λ JS μ½λλ₯Ό μ€νν μ μλλ‘ νκΈ° μν΄ λ§λ€μ΄μ§ λ°νμ νκ²½μ΄λ€.
- λΈλΌμ°μ μλ μ ν λ€λ₯Έ λ°νμ νκ²½μ΄κΈ° λλ¬Έμ, λΈλΌμ°μ κ΄λ ¨ κ°μ²΄ (window λ±) μλ μ κ·Όν μ μλ€.
- λμ , μλ²λ₯Ό ꡬμΆν λ νμν λ€λ₯Έ λ³μλ€ (νκ²½λ³μ λ±) μ μ κ·Όν μ μλλ‘ μ€μ λμ΄ μλ€.
β¨ Node μ μ μ κ°μ²΄
λ€μ μ²μμΌλ‘ λμκ°, node μμ this λ₯Ό μΆλ ₯νλ©΄ λΉ κ°μ²΄κ° λμ¨λ€λ μ¬μ€μ κΈ°μ΅νμ.
console.log(this) // {}
Node μλ window μ document λμ λ€λ₯Έ μ μ κ°μ²΄κ° μ‘΄μ¬νλ€. λ°λ‘ global μ΄λΌλ κ°μ²΄μ΄λ€.
global κ°μ²΄λ λ€μκ³Ό κ°μ΄ ꡬμ±λμ΄ μλ€.
<ref *1> Object [global] {
global: [Circular *1],
clearInterval: [Function: clearInterval],
clearTimeout: [Function: clearTimeout],
setInterval: [Function: setInterval],
setTimeout: [Function: setTimeout] {
[Symbol(nodejs.util.promisify.custom)]: [Function (anonymous)]
},
queueMicrotask: [Function: queueMicrotask],
clearImmediate: [Function: clearImmediate],
setImmediate: [Function: setImmediate] {
[Symbol(nodejs.util.promisify.custom)]: [Function (anonymous)]
}
}
π μ μ κ°μ²΄κ° global μΈλ° μ console.log(this) λ₯Ό μ€ννλ©΄ λΉ κ°μ²΄κ° λμ¬κΉ?
κ·Έ μ΄μ λ λ€μκ³Ό κ°λ€.
- Nodeμμ μ€νλλ js νμΌμ νλμ λͺ¨λ(module) μ΄λ€.
- μ€μ λ‘ node λͺ
λ Ήμ΄λ₯Ό ν΅ν΄ js νμΌ νλλ₯Ό μ€ννλ©΄, νμΌμ μ 체 script κ° νλμ ν¨μ μμ λ€μ΄κ°κ² λλ€.
- Node μμ§μ ν΄λΉ ν¨μλ₯Ό μ€νν¨μΌλ‘μ¨ μ¬μ©μκ° μμ±ν μ½λμ κ²°κ³Όλ₯Ό μΆλ ₯νλ κ²μ΄λ€.
- κ²°κ³Όμ μΌλ‘, js νμΌμμ μμ±νλ μ½λ μ 체λ νλμ ν¨μ λ΄λΆμ λ€μ΄κ°κ² λλ κ²μ΄λ―λ‘, μ§μ scope λ₯Ό κ°μ§κ² λλ€.
μ μ¬μ§μ μ½λ μ€ κ°λ°μκ° μμ±ν μ½λκ° μμνλ μμ μ 첫 λ²μ§Έ μ€μ console.log λΆν°μ΄λ€.
μμ²λΌ js μ½λλ₯Ό node μ€ννκ²½μμ μ€νν λ debugger λ₯Ό μ°κ²°ν΄μ νμΈν΄λ³΄λ©΄, μ½λκ° νλμ ν¨μ μμ λ€μ΄κ° μλ€λ κ²μ λ³Ό μ μμ κ²μ΄λ€.
π js νμΌμ νλμ ν¨μ μμμ μ€νλλ―λ‘, ν΄λΉ ν¨μ λ΄λΆμ μ‘΄μ¬νλ κΈ°λ³Έ κ°μ²΄κ° this μ μ°Έμ‘°κ°μ΄ λλ€.
λ°λΌμ, nodejs νμΌ μμμμ this λ₯Ό μΆλ ₯ν κ²°κ³Όλ λ€μκ³Ό κ°λ€.
console.log(this, module.exports, exports); // {}, {}, {}
console.log(this === module.exports); // true
console.log(this === exports); // true
console.log(module.exports === exports); // true
console.log(this === global); // false
module.exports μ exports λ νλμ js νμΌμ λͺ¨λλ‘ μ¬μ©ν μ μλλ‘ ν΄μ£Όλ λΉ κ°μ²΄μ΄λ€. μ΄ λΉ κ°μ²΄κ° 곧 nodejs μμ μ€νλλ νμΌμ this κ° λλ€.
π κ·Έλ λ€λ©΄ global μ΄ μ μ κ°μ²΄λΌλ κ²μ νμΈν μ μλ λ°©λ²μ μλ?
λΉμ°ν νμΈν μ μλ€!!
JS μ this μ νΉμ§ μ€, μ΄λ€ ν¨μλ μΌλ° ν¨μλ‘ μ€νλλ€λ©΄ ν΄λΉ ν¨μ λ΄λΆμμ μ°Έμ‘°νλ this λ μ μκ°μ²΄λΌλ μ μ΄ μμλ€. μ΄ νΉμ§μ νμ©ν΄ js νμΌ λ΄λΆμ μλ‘μ΄ ν¨μλ₯Ό μμ±ν΄ this λ₯Ό μΆλ ₯νλλ‘ ν΄λ³΄μ.
function a() {
console.log(this) // global
console.log(this === global) // true
}
a()
a ν¨μλ μΌλ° ν¨μλ‘ μ€νλμκΈ° λλ¬Έμ λ΄λΆμμ μΆλ ₯ν this λ μ μκ°μ²΄μ΄λ©°, global μ΄λΌλ κ²°κ³Όλ¬Όμ΄ μΆλ ₯λλ€. λν, ν΄λΉ ν¨μ λ΄λΆμ this μ global μ λΉκ΅ν΄λ³΄λ©΄ 'λμΌνλ€' (true) λΌλ κ²°κ³Όκ° λμ¨λ€.
β¨ νμ΄ν ν¨μμ this
μ΄μ κΈμμ this μ νΉμ§ λλΆλΆμ μ§κ³ λμ΄κ°μ§λ§, νμ΄ν ν¨μμΌ λ λνλλ this μ νΉμν νΉμ§μ λλ½νμ¬ μ΄λ² κΈμ μ΄μ΄μ μ€λͺ
ν΄λ³Έλ€.
νμ΄ν ν¨μλ λ€λ₯Έ ν¨μμ λ€λ₯΄κ², μμ μ thisκ° μλ€. μ΄ λ§μ μλ―Έλ, νμ΄ν ν¨μ λ΄λΆμμμ this λ μΌλ°μ μΈ ν¨μμ²λΌ ν΄λΉ ν¨μλ₯Ό νΈμΆνκ±°λ μμ ν κ°μ²΄λ₯Ό μ°Έμ‘°νμ§ μλλ€λ κ²μ΄λ€. λμ , νμ΄ν ν¨μμ this λ νμ΄ν ν¨μλ₯Ό λλ¬μΈλ μμ μ€μ½νμ this λ₯Ό μ¬μ©νλ€. (λλ¬Έμ lexical this λ‘ λΆλ¦¬κΈ°λ νλ€)
μμλ₯Ό λ€μ΄λ³΄κ² λ€.
const temp = {
age: 10,
tempFunc() {
console.log(this.age) // 10
}
}
temp.tempFunc();
const temp1 = {
age: 10,
tempFunc: () => {
console.log(this.age) // undefined
}
}
temp1.tempFunc();
temp κ°μ²΄μ tempFunc μ κ²½μ° μΌλ° ν¨μλ₯Ό μ¬μ©νκ³ μμΌλ―λ‘, λ©μλλ‘ νΈμΆλ μ νΈμΆλ κ°μ²΄λ₯Ό this μ κ°μΌλ‘ μ°Έμ‘°νμ¬ temp λ΄μμ age λ₯Ό μ°Ύκ³ , κ·Έ κ²°κ³Όλ₯Ό λ°ννλ€.
κ·Έλ¬λ temp1 κ°μ²΄μ tempFunc λ μ‘°κΈ λ€λ₯΄λ€. ν΄λΉ ν¨μλ νμ΄ν ν¨μμ΄κΈ° λλ¬Έμ, μμ μ€μ½νμ this λ₯Ό μ¬μ©νλ€. tempFunc μ μμ μ€μ½νμΈ μ μ κ°μ²΄μμλ age λΌλ κ°μ΄ μ μΈλμ§ μμκΈ° λλ¬Έμ, undefined κ° μΆλ ₯λμλ€.
π λΆνΈν΄λ, νμν μ΄μ
νμ΄ν ν¨μμμμ this λ μλ μ리λ₯Ό μ΄ν΄νκΈ°λ, μ¬μ©νκΈ°λ μ΄λ €μ΄ κ²μ΄ μ¬μ€μ΄λ€. κ·Έλ¬λ μ΄λ¬ν νΉμ§μ΄ νμν κ²½μ°κ° κ°νΉ λ°μνλ€.
λ¨Όμ λ€μ μ½λλ₯Ό μ΄ν΄λ³΄μ.
let group = {
title: "1λͺ¨λ ",
students: ["보λΌ", "νΈμ§", "μ§λ―Ό"],
showList() {
this.students.forEach(function(student) {
// TypeError: Cannot read property 'title' of undefined
console.log(this.title + ': ' + student)
});
}
};
showList() ν¨μμ this λ group κ°μ²΄μ΄κΈ° λλ¬Έμ, this.students λ₯Ό μ°Έμ‘°νμ¬ forEach λ¬Έμ λ리λ κ²μ΄ κ°λ₯νλ€. κ·Έλ¬λ κ·Έ λ΄λΆμμ μλνλ ν¨μλ μΌλ° ν¨μμ΄κΈ° λλ¬Έμ, this κ° μ°Έμ‘°νλ κ°μ΄ μ μ κ°μ²΄μΈ window (λλ global) μ΄ λμ΄, λ°λ‘ μ μΈμ΄ λμ΄ μμ§ μμ μ΄μ μλ¬λ₯Ό λ°ννκ² λλ€.
μμ νμ΄ν ν¨μλ μμ μ€μ½νμ this λ₯Ό μ¬μ©νλ€κ³ μΈκΈνμλλ°, κ·Έλ λ€λ©΄ λκ°μ μ½λλ₯Ό νμ΄ν ν¨μλ‘ λ°κΎΌλ€λ©΄ μ΄λ»κ² λ κΉ?
let group1 = {
title: "1λͺ¨λ ",
students: ["보λΌ", "νΈμ§", "μ§λ―Ό"],
showList() {
this.students.forEach( student => {
console.log(this.title + ': ' + student) // 1λͺ¨λ : 보λΌ, 1λͺ¨λ : νΈμ§, 1λͺ¨λ₯ : μ§λ―Ό
});
}
};
μλν κ²°κ³ΌμΈ "1λͺ¨λ : 보λΌ", "1λͺ¨λ : νΈμ§", "1λͺ¨λ₯ : μ§λ―Ό"μ΄ μ°¨λ‘λ‘ μΆλ ₯λ κ²μ΄λ€. κ·Έ μ΄μ λ λ°λ‘ forEach λ¬Έ μμ ν¨μκ° νμ΄ν ν¨μμ΄λ―λ‘, μμ μ€μ½ν (showList() ν¨μ μ€μ½ν) μ this λ₯Ό μ°Έμ‘°νκΈ° λλ¬Έμ΄λ€.
μ΄μ κ°μ΄ μΌλ° ν¨μμ μ¬μ©μΌλ‘ μΈν΄ this μ μ°Έμ‘°κ°μ΄ λ°λλ κ²½μ°, νμ΄ν ν¨μλ₯Ό μ¬μ©νμ¬ κ·Έ λ¬Έμ λ₯Ό ν΄κ²°ν μ μκΈ°λ νλ€.
π λ§μ§λ§μΌλ‘, νμ΄ν ν¨μλ thisκ° μκΈ° λλ¬Έμ μμ±μ ν¨μλ‘ μ¬μ©ν μ μμΌλ©°, new μ ν¨κ» νΈμΆν μλ μλ€.
β¨ λ°°μ΄ μ
- νμ΄ν ν¨μμ κ³ μ ν κ·μΉμ΄ λ무 볡μ‘νκ³ μ΄λ ΅κΈ°λ νμ§λ§, 볡μ‘νλ§νΌ μ μ©νκ² μ¬μ©λ λκ° λΆλͺ μ°Ύμμ¬ κ²μ΄λΌκ³ μκ°νλ€. κ·Έλ° μλ―Έμμ Javascript λ μκ·Ό λ§λ₯ μΈμ΄λΌλ μκ°μ΄ λ λ€. "μ΄κ±Έ μ΄λ κ² ν΄μ£Όλ 건 μ μμ§?" ν΄μ μ°Ύμ보면 λλΆλΆ μ‘΄μ¬νλ κΈ°λ₯μ΄λ€... λμ 곡λΆκ° λΆμ‘±ν λΏ!
β¨ μ°Έκ³ μλ£
'π» DEV > Javascript & NodeJS' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Javascript] ν΄λ‘μ (Closure) (0) | 2021.10.06 |
---|---|
[Javascript] μ€ν 컨ν μ€νΈ (Execution Context) μ μμ€μ½λ (0) | 2021.09.28 |
[Javascript] Javascript μ this λ? (0) | 2021.09.07 |
[Javascript] μ΄λ²€νΈ 루ν (Event Loop) λ? (0) | 2021.09.07 |
[NodeJS] NodeJS λ Single Thread μΌκΉ? Multi Thread μΌκΉ? (1) | 2021.09.06 |
λκΈ