this
λ μμ μ΄ μν κ°μ²΄ λλ μμ μ΄ μμ±ν μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν€λ μκΈ° μ°Έμ‘° λ³μ(self-referencing variable)λ€. λ€λ₯Έ μΈμ΄μ this
μλ λ¬λ¦¬ μλ°μ€ν¬λ¦½νΈμ this
λ μ΄λμλ μ¬μ©ν μ μλ€. μλ°μ€ν¬λ¦½νΈμ this
λ μ€ν 컨ν
μ€νΈλ₯Ό μμ±ν λ ν¨κ» κ²°μ λλ€. μ€ν 컨ν
μ€νΈλ ν¨μλ₯Ό νΈμΆν λ μμ±λλ―λ‘, this
λ ν¨μλ₯Ό νΈμΆν λ κ²°μ λλ€κ³ ν μ μλ€. ν¨μλ₯Ό μ΄λ€ λ°©μμΌλ‘ νΈμΆνλλμ λ°λΌ κ°μ΄ λ¬λΌμ§λ€. μλμμ μμΈν μ΄ν΄λ³΄μ.
λ€λ₯Έ μΈμ΄μ λ¬λ¦¬ μλ°μ€ν¬λ¦½νΈμ this
λ μ΄λμλ μ¬μ©ν μ μλ€κ³ νλ€. μ μμμλ this
λ₯Ό μ°Έμ‘°ν μ μλλ° μ μμμ this
λ₯Ό νΈμΆνλ©΄ this
μλ μ μ κ°μ²΄κ° λ°μΈλ©λλ€.
μ¬κΈ°μ λ°μΈλ©μ μλ―Έλ₯Ό μ μ μ€λͺ νκ³ κ°κ² λ€.
λ°μΈλ©μ΄λ μλ³μμ κ°μ μ°κ²°νλ κ³Όμ μ μλ―Ένλ€. μλ₯Ό λ€μ΄, λ³μ μ μΈμ λ³μ μ΄λ¦(μλ³μ)κ³Ό ν보λ λ©λͺ¨λ¦¬ 곡κ°μ μ£Όμλ₯Ό λ°μΈλ©νλ κ²μ΄λ€.
this
λ°μΈλ©μthis
μthis
κ° κ°λ¦¬ν¬ κ°μ²΄λ₯Ό λ°μΈλ©νλ κ²μ΄λ€. (this
λ ν€μλλ‘ λΆλ₯λμ§λ§ μλ³μ μν μ νλ€)
this
μ μ μ κ°μ²΄κ° λ°μΈλ©λλ€ ===this
κ° μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
console.log(this); //undefined
this
λ κ°μ²΄μ νλ‘νΌν°λ λ©μλλ₯Ό μ°Έμ‘°νκΈ° μν μκΈ° μ°Έμ‘° λ³μμ΄λ―λ‘ μΌλ°μ μΌλ‘ κ°μ²΄μ λ©μλ, μμ±μ ν¨μ λ΄λΆμμλ§ μλ―Έκ° μλ€. μ μ곡κ°μ΄λ μΌλ° ν¨μ λ΄λΆμμ this
λ₯Ό μ°Έμ‘°νλ©΄ μ격 λͺ¨λ(strict mode)μμλ undefined
κ° λ°μΈλ©λλ€. μ΄λ ESLint
λ±μ μ¬μ©ν΄λ λ§μ°¬κ°μ§λ€. μ μ곡κ°μ΄λ, μΌλ° ν¨μ λ΄λΆμμ this
λ₯Ό μ¬μ©ν νμκ° μκΈ° λλ¬Έμ΄λ€.
this
λ νΈμΆν 주체μ μ 보λ₯Ό λ΄λλ€. μ΄λ€ ν¨μλ₯Ό ν¨μλ‘μ¨ νΈμΆν κ²½μ°μ this
κ° μ§μ λμ§ μλλ€. κ·Έλ°λ° ν¨μλ‘μ¨ νΈμΆνλ κ²μ νΈμΆ 주체λ₯Ό λͺ
μνμ§ μκ³ κ°λ°μκ° μ½λμ μ§μ κ΄μ¬ν΄μ μ€νν κ²μ΄κΈ° λλ¬Έμ νΈμΆ 주체μ μ 보λ₯Ό μ μ μλ κ²μ΄λ€. μ€ν 컨ν
μ€νΈμ νμ±ν λΉμμ this
κ° μ§μ λμ§ μμ κ²½μ° this
μλ μ μ κ°μ²΄κ° λ°μΈλ©λλ€. λ°λΌμ ν¨μμμμ this
λ μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€.
νμ§λ§ μμμ λ§νλ―μ΄ μ격 λͺ¨λλ ESLint
λ±μ μ¬μ©ν κ²½μ° μ μ κ°μ²΄μλ undefined
κ° λ°μΈλ©λλ€.
function foo() {
console.log(this); //undefined
}
foo();
μΌλ° ν¨μλ‘ νΈμΆλ λͺ¨λ ν¨μ(μ€μ²©ν¨μλ μ½λ°± ν¨μ ν¬ν¨) λ΄λΆμ this
μλ μ μ κ°μ²΄κ° λ°μΈλ©λλ€. μ°Έκ³ λ‘ λΈλΌμ°μ νκ²½μμ μ μ κ°μ²΄λ window
, Node.JS νκ²½μμλ global
μ΄λ€.
λ©μλλ‘ νΈμΆλ λ, λ©μλ λ΄λΆ this
μλ λ©μλλ₯Ό νΈμΆν κ°μ²΄κ° λ°μΈλ©λλ€. μ νκΈ°λ²μ κ²½μ° λ§μ§λ§ μ μμ λͺ
μλ κ°μ²΄κ° 곧 this
κ° λλ κ²μ΄λ€. μ¬κΈ°μ μ£Όμν΄μΌν μ μ΄ νλ μλλ°, this
λ λ©μλλ₯Ό μμ ν κ°μ²΄κ° μλ λ©μλλ₯Ό νΈμΆν κ°μ²΄μ λ°μΈλ©λλ€λ μ μ΄λ€.
λ©μλλ νλ‘νΌν°μ λ°μΈλ©λ ν¨μλ€.
λ§μ½ Person
κ°μ²΄μ λ©μλλ‘ getName
μ΄λΌλ λ©μλκ° μλ€κ³ νμ λ, getName
νλ‘νΌν°κ° κ°λ¦¬ν€λ ν¨μ κ°μ²΄λ Person
κ°μ²΄μ ν¬ν¨λ κ²μ΄ μλλΌ λ
립μ μΌλ‘ μ‘΄μ¬νλ λ³λμ κ°μ²΄μ΄λ€. κ·Έμ getName
νλ‘νΌν°κ° ν¨μ κ°μ²΄λ₯Ό κ°λ¦¬ν€κ³ μμ λΏμ΄λ€.
λ°λΌμ getName
νλ‘νΌν°κ° κ°λ¦¬ν€λ ν¨μ κ°μ²΄, getName
λ©μλλ λ€λ₯Έ κ°μ²΄μ νλ‘νΌν°μ ν λΉνλ κ²μΌλ‘ λ€λ₯Έ κ°μ²΄μ λ©μλκ° λ μλ μκ³ μΌλ° λ³μμ ν λΉνμ¬ μΌλ° ν¨μλ‘ νΈμΆλ μλ μλ€.
μ½λ°±ν¨μλ‘ ν¨μκ° νΈμΆλ λλ μ½λ°±ν¨μλ₯Ό μ€νν ν¨μμ λ΄λΆ λ‘μ§μμ μ ν κ·μΉμ λ°λΌ κ°μ΄ κ²°μ λλ€. μ½λ°±ν¨μλ ν¨μμ΄κΈ° λλ¬Έμ κΈ°λ³Έμ μΌλ‘ this
μ μ μ κ°μ²΄κ° λ°μΈλ©λμ§λ§, μ½λ°±ν¨μλ₯Ό μ€νν ν¨μκ° λ³λλ‘ μ½λ°±ν¨μμ this
κ° λ λμμ μ§μ ν κ²½μ°μλ κ·Έ λμμ΄ λ°μΈλ©λλ€.
μμ μ½λλ₯Ό ν΅ν΄ ν λ² μ΄ν΄λ³΄μ.
setTimeOut(function () {
console.log(this); //window
}, 300);
const $ = (selector) => document.querySelector(selector);
$('#app').addEventListener('click', function (e) {
console.log(this); //app
});
setTimeOut
ν¨μλ this
κ° λ λμμ λ°λ‘ μ§μ νμ§ μλλ€. this
μλ μ μκ°μ²΄κ° λ°μΈλ©λλ€.
addEventListner
λ©μλλ μμ μ this
λ₯Ό μμνλλ‘ μ μλΌ μλ€. κ·Έλ¬λ―λ‘, λ©μλ λͺ
μ (.) μλΆλΆμ΄ this
μ λ°μΈλ©λλ κ²μ΄λ€.
μμ±μ ν¨μ λ΄λΆμ this
μλ μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€κ° λ°μΈλ©λλ€.
const Crew = function (name, age) {
this.name = name;
this.age = age;
}
const harry = new Crew('Harry', 23);
console.log(harry); //Crew { name: 'Harry', age: 23 }
κ·Έλ¬νλ€.
ES6
λΆν° ν¨μ λ΄λΆμμ this
κ° μ μκ°μ²΄λ₯Ό κ°λ¦¬ν€λ λ¬Έμ λ₯Ό 보μνκ³ μ, νμ΄ν ν¨μκ° μΆκ°λμλ€. νμ΄ν ν¨μλ μ€ν 컨ν
μ€νΈλ₯Ό μμ±ν λ this
λ°μΈλ© κ³Όμ μμ²΄κ° λΉ μ§κ² λμ΄, μμ μ€μ½νμ this
λ₯Ό κ·Έλλ‘ νμ©ν μ μλ€. μλμμ λμ¬ call, apply, bind λ±μ λ°©λ²μΌλ‘λ νμ΄ν ν¨μμ this
λ₯Ό μ€λ²λΌμ΄λ©ν μ μλ€.
μ¦, νμ΄ν ν¨μ λ΄λΆμ this
λ 무쑰건 μμ μ€μ½νμ this
μ κ°λ€.
Function.prototype.call(thisArg[, arg1[, arg2[, ...]]])
call
λ©μλλ λ©μλμ νΈμΆ μ£Όμ²΄μΈ ν¨μλ₯Ό μ¦μ μ€ννλλ‘ νλ λ©μλμ΄λ€. μ΄λ call
λ©μλμ 첫 λ²μ§Έ μΈμλ₯Ό this
λ‘ λ°μΈλ©νκ³ μ΄νμ μΈμλ€μ νΈμΆν ν¨μμ 맀κ°λ³μλ‘ νλ€.
const func = function (a, b, c) {
console.log(this, a, b, c);
}
console.log(func(1, 2, 3)); // window{ ... } 1 2 3
console.log(func.call({ x: 1 }, 4, 5, 6}; // { x: 1} 4 5 6
Function.prototype.apply(thisArg[, argsArray])
apply
λ©μλλ call
λ©μλμ κΈ°λ₯μ μΌλ‘λ μμ ν λμΌνλ€. κ·Έλ¬λ apply
λ©μλλ λ λ²μ§Έ μΈμλ₯Ό λ°°μ΄λ‘ λ°μ κ·Έ λ°°μ΄μ μμλ€μ νΈμΆν ν¨μμ 맀κ°λ³μλ‘ μ§μ νλ€λ μ μμλ§ μ°¨μ΄κ° μλ€.
const func = function (a, b, c) {
console.log(this, a, b, c);
}
console.log(func(1, 2, 3)); // window{ ... } 1 2 3
console.log(func.apply({ x: 1 }, [4, 5, 6]}; // { x: 1} 4 5 6
Function.prototype.bind(thisArg[, arg1[, arg2[, ...]]])
bind
λ©μλλ ES5
μ μΆκ°λ λ©μλλ‘, call
λ©μλμ μ μ¬νκΈ΄ νμ§λ§, ν¨μλ₯Ό μ¦μ νΈμΆνμ§ μκ³ , λ겨 λ°μ this
λ° μΈμλ€μ λ°νμΌλ‘ μλ‘μ΄ ν¨μλ₯Ό λ°ννκΈ°λ§ νλ λ©μλμ΄λ€.
νΉμ΄ν μ μ bind
λ©μλλ‘ μλ‘ λ§λ ν¨μλ name
νλ‘νΌν°μ "bound"λΌλ μ λμ΄κ° λΆλλ€λ κ²μ΄λ€. μ΄λ₯Ό ν΅ν΄ call
μ΄λ apply
λ³΄λ€ μ½λλ₯Ό μΆμ νκΈ°μ μμν΄μ§ λ©΄μ΄ μλ€.
const func = function() {
console.log(this);
}
const bindFunc = func.bind({ x: 1 });
console.log(func); // window{ ... }
console.log(bindFunc); // { x: 1}
console.log(func.name); // func
console.log(bindFunc.name); // bound func
μ μμμμ this
-> μ μ κ°μ²΄
μΌλ° ν¨μ νΈμΆμμμ this
-> μ μ κ°μ²΄
λ©μλ νΈμΆμμμ this
-> λ©μλλ₯Ό νΈμΆν 주체
μμ±μ ν¨μ νΈμΆμμμ this
-> μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€
νμ΄ν ν¨μ λ΄λΆμμμ this
-> μμμ€μ½νμ this
call/apply/bind λ©μλμ μν νΈμΆμμμ this
-> apply/call/bind λ©μλμ 첫 λ²μ§Έ μΈμλ‘ μ λ¬ν κ°μ²΄
μ½μ΄ μλ°μ€ν¬λ¦½νΈ
λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive
YOU DON'T KNOW JS
good