π μκΈ° μ°Έμ‘° λ³μ( self-referencing variable )
μμ μ΄ μν κ°μ²΄ λλ μμ μ΄ μμ±ν μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν€λ νΉμν μλ³μ
μμ μ΄ μν κ°μ²΄ λλ μμ μ΄ μμ±ν μΈμ€ν΄μ€μ 'νλ‘νΌν°λ λ©μλ μ°Έμ‘° κ°λ₯'
this ν€μλ
ν¨μ νΈμΆ μ arguments κ°μ²΄μ this
κ° μ묡μ μΌλ‘ ν¨μ λ΄λΆμ μ λ¬λκ³ , arguments κ°μ²΄λ₯Ό μ§μ λ³μμ²λΌ μ¬μ©ν μ μλ―μ΄, this
λ μ§μ λ³μμ²λΌ μ¬μ©ν μ μλ€. μ΄ λ, this
κ° κ°λ¦¬ν€λ κ°, μ¦ this λ°μΈλ©
μ ν¨μ νΈμΆ λ°©μμ μν΄ λμ μΌλ‘ κ²°μ λλ€. μ¬κΈ°μ this λ°μΈλ©
μ this
μ this
κ° κ°λ¦¬ν¬ κ°μ²΄λ₯Ό λ°μΈλ© νλ κ²μ μλ―Ένλ€.
ν¨μκ° νΈμΆλλ λ°©μμ λ°λΌ this
μ λ°μΈλ© λ κ°, μ¦ this λ°μΈλ©
μ΄ λμ μΌλ‘ κ²°μ λκ³ , strict mode
λν this λ°μΈλ©
μ μν₯μ μ€λ€. this
λ μ½λ μ΄λμμλ μ°Έμ‘°κ° κ°λ₯νλ€. μ μμμ μ¬μ©λ κ²½μ° window
λ₯Ό μ°Έμ‘°νκ³ , ν¨μ λ΄λΆμμ μ¬μ©λ κ²½μ° μκ° μ°Έμ‘°νλ€. νμ§λ§ strict mode
μΌ κ²½μ°, μΌλ° ν¨μ λ΄λΆμ this
μλ undefined
κ° λ°μΈλ© λλ€. μΌλ° ν¨μ λ΄λΆμμλ this
λ₯Ό μ¬μ©ν νμκ° μκΈ° λλ¬Έμ΄λ€.
// βοΈμ μμμ thisλ μ μ κ°μ²΄ window μ°Έμ‘°
console.log(this); // window
function square(num) {
// βοΈμΌλ° ν¨μ λ΄λΆμμ thisλ μ μ κ°μ²΄ windowλ₯Ό κ°λ¦¬ν¨λ€
console.log(this); // window
return num + num;
}
square(2);
const person = {
name: 'Tia',
getName(){
// βοΈλ©μλ λ΄λΆμμ thisλ λ©μλλ₯Ό νΈμΆν κ°μ²΄λ₯Ό κ°λ¦¬ν¨λ€
console.log(this); // {name: 'Tia', getName: f}
return this.name;
}
};
console.log(person.getName()); // Tia
function Person(name) {
this.name = name;
// βοΈμμ±μ ν¨μ λ΄λΆμμ thisλ μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€λ₯Ό κ°λ¦¬ν¨λ€
console.log(this); // Person {name: 'Tia', __proto__: { constructor: f}}
};
const me = new Person('Tia');
ν¨μ νΈμΆ λ°©μκ³Ό this λ°μΈλ©
this λ°μΈλ©
μ ν¨μ νΈμΆ λ°©μ, μ¦ ν¨μκ° μ΄λ»κ² νΈμΆλμλμ§μ λ°λΌ λμ μΌλ‘ κ²°μ λλ€. μ΄λ this λ°μΈλ©
μ κ²½μ°μλ λ μ컬 μ€μ½νμ λ€λ₯΄κ² ν¨μ νΈμΆ μμ μ κ²°μ λλ€.
μΌλ° ν¨μ νΈμΆ
κΈ°λ³Έμ μΌλ‘ this
μλ μ μ κ°μ²΄( global object )κ° λ°μΈλ© λλ€. λͺ¨λ ν¨μ( μ μ ν¨μ, μ€μ²© ν¨μ, μ½λ°± ν¨μ ν¬ν¨ )λ μΌλ° ν¨μλ‘ νΈμΆ μ ν¨μ λ΄λΆμ this
μλ μ μ κ°μ²΄κ° λ°μΈλ© λλ€. μ΄λ λ§μ½ strict mode
μΌ κ²½μ°, μΌλ° ν¨μ λ΄λΆμ this
μλ undefined
κ° λ°μΈλ© λλ€.
function check () {
console.log(`check's this: `, this); // window, if strict mode: undefined
const checkAgain = () => {
console.log(`checkAgain's this: `, this) // window, if strict mode: undefined
}
checkAgain();
}
check();
λ©μλ νΈμΆ
λ©μλλ₯Ό νΈμΆν κ°μ²΄, μ¦ λ©μλ νΈμΆ μ λ©μλ μ΄λ¦ μμ λ§μΉ¨ν μ°μ°μ.
μμ κΈ°μ ν κ°μ²΄κ° λ°μΈλ© λλ€. λ©μλ λ΄λΆμ this
λ λ©μλλ₯Ό μμ ν κ°μ²΄κ° μλ λ©μλλ₯Ό νΈμΆν κ°μ²΄μ λ°μΈλ© λλ€.
const person = {
name: 'Tia',
getName() {
// λ©μλ λ΄λΆμ thisλ λ©μλλ₯Ό νΈμΆν κ°μ²΄μ λ°μΈλ©
return this.name;
}
};
console.log(person.getName()); // Tia
const anotherPerson = {
name: 'Anne',
};
anotherPerson.getName = person.getName;
console.log(anotherPerson.getName()); // Anne
const getName = person.getName;
console.log(getName()); // ''
// μΌλ° ν¨μλ‘ νΈμΆλ getName ν¨μ λ΄λΆμ this.nameμ window.nameκ³Ό κ°μ
μμ±μ ν¨μ νΈμΆ
π μμ±μ ν¨μ: κ°μ²΄( μΈμ€ν΄μ€ )λ₯Ό μμ±νλ ν¨μ
μΌλ° ν¨μμ λμΌν λ°©λ²μΌλ‘ μμ±μ ν¨μ μ μ νnew
μ°μ°μμ ν¨κ» νΈμΆνμ¬ μμ±μ ν¨μλ₯Ό λμνλ€.
μ΄ λ,new
μ°μ°μμ ν¨κ» νΈμΆνμ§ μμΌλ©΄ μΌλ° ν¨μλ‘ λμνλ€.
μμ±μ ν¨μκ° μμ±ν μΈμ€ν΄μ€κ° λ°μΈλ© λλ€.
Function.prototype.apply/call/bind νΈμΆ
apply
, call
, bind
λ Function.prototype
μ λ©μλμ΄λ€. μ¦, λͺ¨λ ν¨μκ° μμλ°μ μ¬μ©μ΄ κ°λ₯νλ€.
βͺοΈ apply / call
apply
μ call
λ©μλμ λ³Έμ§μ κΈ°λ₯μ ν¨μλ₯Ό νΈμΆνλ κ²μ΄λ€. apply
μ call
λ©μλλ 첫 λ²μ§Έ μΈμλ‘ μ λ¬ν νΉμ κ°μ²΄λ₯Ό νΈμΆν ν¨μμ this
μ λ°μΈλ©νλ€.
function thisBinding() {
return this;
};
// thisλ‘ μ¬μ©ν κ°μ²΄
const thisObj = { a: 1 };
console.log(thisBinding()); // window
console.log(thisBinding.apply(thisObj)); // {a: 1}
console.log(thisBinding.call(thisObj)); // {a: 1}
βͺοΈ bind
bind
λ©μλμ λ³Έμ§μ κΈ°λ₯μ ν¨μλ₯Ό νΈμΆνμ§ μκ³ μ λ¬ν κ°μΌλ‘ this λ°μΈλ©
μ΄ κ΅μ²΄λ ν¨μλ₯Ό μλ‘κ² μμ±νμ¬ λ°ννλ κ²μ΄λ€.
function thisBinding() {
return this;
};
// thisλ‘ μ¬μ©ν κ°μ²΄
const thisObj = { a: 1 };
console.log(thisBinding.bind(thisObj)); // thisBinding
// bind λ©μλλ ν¨μλ₯Ό νΈμΆνμ§λ μμΌλ―λ‘ λͺ
μμ μΌλ‘ νΈμΆν΄μΌ ν¨
console.log(thisBinding.bind(thisObj)()); // { a: 1}
bind
λ λ©μλμ this
μ λ©μλ λ΄λΆμ μ€μ²© ν¨μ λλ μ½λ°± ν¨μμ this
κ° λΆμΌμΉνλ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μ μ©νκ² μ¬μ©λλ€.
const person = {
name: 'Tia',
getName(callback) {
// bind λ©μλλ‘ callback ν¨μ λ΄λΆμ this λ°μΈλ©μ μ λ¬
setTimeout(callback.bind(this), 100);
}
};
person.getName(function(){
console.log(`Hi! my name is ${this.name}! π`)
})
νμ΄ν ν¨μμ this
νμ΄ν ν¨μλ μΌλ°μ μΈ ν¨μμλ λ€λ₯΄κ² μμ λ§μ this
λ₯Ό μμ±νμ§ μλλ€. λμ , νμ΄ν ν¨μκ° μ μλ μμ μ μΈλΆ μ€μ½νμ this
λ₯Ό μ°Έμ‘°νλ€. μ΄λ νμ΄ν ν¨μ λ΄λΆμ this
λ μμ μ€μ½νμ this
μ λμΌν κ°μ κ°μ§λ κ²μ μλ―Ένλ€. λ°λΌμ μ μ μ€μ½νμμ νμ΄ν ν¨μμ this
λ₯Ό μ¬μ©ν κ²½μ°, μ°Έμ‘°ν λ€λ₯Έ κ°μ΄ μμΌλ―λ‘ μ μ κ°μ²΄, μ¦ window
λ₯Ό μ°Έμ‘°νλ€.