λ©΄μ λ¨κ³¨ μ§λ¬Έ
"this"
λ©΄μ λ¨κ³¨ μ§λ¬Έ μ€ νλμΈ "ν¨μ λ΄ `this`μ λ©μλ λ΄ `this`μ μ°¨μ΄"μ λν΄ μ€λͺ νλ©΄μ JSμμ `this` λ°μΈλ© λ°©μμ λν΄ μ‘°κΈ λ κΉμ΄ μ΄ν΄λ³΄κ² λ€.
μλ°μ€ν¬λ¦½νΈ ν¨μλ ν¬κ² μΌλ° ν¨μμ νμ΄ν ν¨μλ‘ λλ μ μμΌλ©°, μ΄ λμ `this` λ°μΈλ© λ°©μμμ ν° μ°¨μ΄κ° μλ€.
μΌλ° ν¨μλ ν¨μλ‘λ μ¬μ©λ μ μκ³ , λ©μλλ‘λ μ¬μ©λ μ μλ€.
μΌλ° ν¨μ ννμ λ΄ `this`: λμ λ°μΈλ© (Dynamic Scope)
μΌλ° ν¨μμ `this`λ ν¨μκ° νΈμΆλ λμ 컨ν μ€νΈμ λ°λΌ κ²°μ λλ€.
μ¦, λμ λ°μΈλ©μ΄ μ΄λ£¨μ΄μ§λ©° ν¨μκ° νΈμΆλ κ°μ²΄μ λ°λΌ `this`κ° λ¬λΌμ§λ€.
ν¨μ: μ μμμ νΈμΆλ ν¨μ λ΄ `this` → 무μ§μ± window(global)
function Constructor() { // νΈμΆμ§: Constructor κ°μ²΄
this.filed = 0; // (μμ λμΌ) Constructor κ°μ²΄ λ΄ this.filed = 0
function inner() { // νΈμΆμ§: μ μ κ°μ²΄ (κ°μ²΄ν νΉμ μ΄κΈ°ν λμ§ μμ)
console.log(this.field); // (μμ λμΌ) this. filed = undefined (μ μκ°μ²΄μ var μ μΈ)
}
inner();
}
var object = new Constructor();
- `inner`λ κ°μ²΄ν λμ§ μμκΈ° λλ¬Έμ `inner()` ν¨μ λ΄ thisλ 무μ§μ± `window/global`
function Constructor() { // νΈμΆμ§ : Constructor κ°μ²΄
this.field = 0; // (μμ λμΌ) Constructor κ°μ²΄ λ΄ this.field = 0
setInterval(function inner() { // νΈμΆμ§ : μ μκ°μ²΄ (κ°μ²΄ν νΉμ μ΄κΈ°ν λμ§ μμ)
console.log(this.field); // (μμ λμΌ) this.field = undefined (μ μκ°μ²΄μ var μ μΈ)
}, 1000);
}
var object = new Constructor();
- μ¬μ ν `inner`λ κ°μ²΄νλμ§ μμλ€. → `inner()` ν¨μ λ΄ thisλ `window/global`
- κ°μ²΄ν νΉμ μ΄κΈ°νκ° μλμΌλ©΄ κ·Έλ₯ λ°μΌλ‘ λκ°λ©΄ λλ€. κ·Έλ¦¬κ³ Global Object(μ μκ°μ²΄)λ₯Ό λ§λμ μμΌλ `var` μλ‘ μμ±
- `this.field = 0;`μ `new Constructor()` κ°μ²΄ν λλ¬Έμ κ°μ²΄ λ΄ κ°ν. `inner()` ν¨μλ κ°μ²΄ν λμ§ μμ λ°μΌλ‘ λκ°.
ν¨μλ κ°μ²΄νκ° λλ μκ° κ°μ²΄κ° λλ€. → ν΄λΉ ν¨μ λ΄μ thisλ μ μκ°μ²΄κ° μλ ν¨μ λ΄ κ°μ²΄λ‘ λ°λλ€.
function Constructor1() { // νΈμΆμ§ : Constructor1 κ°μ²΄
this.field = 0; // (μμ λμΌ) Constructor1 κ°μ²΄ λ΄ this.field = 0
console.log(this.field) // (μμ λμΌ) Constructor1 κ°μ²΄ λ΄ this.field = 0
function doublewrapper() { // νΈμΆμ§ : μ μκ°μ²΄ (κ°μ²΄ν νΉμ μ΄κΈ°ν λμ§ μμ)
this.field = 1; // (μμ λμΌ) μ μκ°μ²΄ λ΄ this.field = 1
console.log(this.field); // (μμ λμΌ) μ μκ°μ²΄ λ΄ this.field = 1
function Constructor2(){ // νΈμΆμ§ : Constructor2 κ°μ²΄
console.log(this.field) // (μμ λμΌ) Constructor2 κ°μ²΄ λ΄ this.field = undefined
}
new Constructor2()
}
doublewrapper()
}
new Constructor1();
console.log(field);
- `Constructor1()`μ `this` → `Constructor1` κ°μ²΄ (λ«ν)
- `doublewrapper()`μ `this` → μ μ κ°μ²΄(μ λ«ν)
- `Constructor2()`μ `this` → `Constructor2` κ°μ²΄ (λ«ν)
λ©μλ: λ©μλλ‘ μ¬μ©λ ν¨μμμμ `this`: λμ λ°μΈλ© = λμ μ€μ½ν(Dynamic Scope)
- μΌλ° ν¨μκ° κ°μ²΄μ λ©μλλ‘ μ¬μ©λλ©΄, `this`λ ν΄λΉ κ°μ²΄λ₯Ό μ°Έμ‘°νλ€. μ¦, `this`λ λ©μλκ° μν κ°μ²΄λ₯Ό μ°Έμ‘°νκ² λλ€.
- κ°μ²΄λ₯Ό μ°Ύμ νμ μμ΄, λ©μλ μ μ μμ²΄λ‘ μΈν΄ λ©μλκ° μν κ°μ²΄κ° `this`
const Object = {
field: 0,
method() {
console.log(this.field); // thisλ Object κ°μ²΄ μ°Έμ‘°
}
};
Object.method(); // 0 μΆλ ₯
- `Object.method()`κ° νΈμΆλμμ λ, `this`λ Object κ°μ²΄λ₯Ό μ°Έμ‘°νλ€.
- λ°λΌμ `this.field`λ `Object`κ°μ²΄μ `field`λ₯Ό μ°Έμ‘°νμ¬ `0`μ΄ μΆλ ₯λλ€.
νμ΄ν ν¨μ ννμ λ΄ `this`: μ μ λ°μΈλ© = μ μ μ€μ½ν (Static, Lexical Scope)
- νμ΄ν ν¨μκ° μ΄λ€ ν¨μμμ μ μΈλμλμ§κ° κΈ°μ€μ΄ λλ€.
function Constructor() {
this.field = 0;
setInterval(() => {
console.log(this.field); // thisλ Constructor κ°μ²΄μ field μ°Έμ‘°
}, 1000);
}
var object = new Constructor(); // 0 μΆλ ₯
- νμ΄ν ν¨μλ μμ μ€μ½νμ `this`λ₯Ό μ°Έμ‘°νλ€. μ΄ κ²½μ°, μμ μ€μ½νλ `Constructor` ν¨μ μ΄λ―λ‘, `this`λ `Constructor` κ°μ²΄λ₯Ό κ°λ₯΄ν¨λ€.
- λ°λΌμ `this.field`λ `Constructor`κ°μ²΄μ `field`λ₯Ό μ°Έμ‘°νμ¬ `0`μ΄ μΆλ ₯λλ€.
- μΌμͺ½: μΌλ°ν¨μ / μ€λ₯Έμͺ½: νμ΄ν ν¨μ | μ°λ¦¬κ° μμ λ°°μ λ Lexical Scopeλ₯Ό κ·Έλλ‘ μ μ© → `Constructor` ν¨μλ₯Ό λ°λΌλ³Έλ€.
μΌλ° ν¨μμ λ©μλμμμ `this` μ°¨μ΄
μΌλ° ν¨μμμμ `this`:
- λμ λ°μΈλ©: μΌλ° ν¨μλ νΈμΆλλ 컨ν μ€νΈμ λ°λΌ `this`κ° λ°λλ€.
- μ μμμ νΈμΆλλ©΄ `this`λ μ μ κ°μ²΄ (`window/global`)λ₯Ό μ°Έμ‘°
- λ©μλλ‘ νΈμΆλλ©΄ `this`λ ν΄λΉ λ©μλλ₯Ό νΈμΆν κ°μ²΄λ₯Ό μ°Έμ‘°
λ©μλμμμ `this`:
- λ©μλ λ΄λΆμ `this`λ λ©μλκ° μν κ°μ²΄λ₯Ό μ°Έμ‘°νλ€.
- λ©μλλ₯Ό νΈμΆν κ°μ²΄μ λ°λΌ `this`κ° λ¬λΌμ§λ€.
λͺ μμ λ°μΈλ© (Explict Binding): `call`, `apply`, `bind`
- μμμ λ°μΈλ©(Implicit Binding)μ μΌλ° ν¨μ ννμμ΄ κ°μ²΄ λ΄ λ©μλλ‘ μ μ λμμ λ `this` = κ°μ²΄ → μΌμμ μ΄λ€.
- λͺ
μμ λ°μΈλ©(Explict Binding)μ ν΄λΉ ν¨μκ° μ΄λ€ κ°μ²΄μμ νΈμΆλμλμ§ κΈ°μ€μ μ§μ μ€λͺ
ν΄μ£Όλ κ²
- λ°©λ²μ `call`, `apply`, `bind`λ₯Ό ν΅ν΄ κ°λ₯νλ€.
`call`κ³Ό `apply`λ₯Ό ν΅ν `this`λ°μΈλ©
function createObject() {
//this.foo = 21
console.log('Inside `createdObject`:', this.foo);
return {
foo: 42,
bar:() { console.log('Inside `bar`:', this.foo); }
};
}
createObject.call({ foo: 21 }).bar(); // 21 μΆλ ₯
- `createdObject.call({ foo: 21 })`λ `createObject` ν¨μμ `this`λ₯Ό `{ foo: 21 }` λ‘ μ€μ νκ³ νΈμΆνλ€.
- λ°λΌμ `this.foo`λ `21`μ΄ μΆλ ₯
- λ΄λΆμ `bar`λ©μλμμ `this`λ createObjectμμ λ°νλ κ°μ²΄λ₯Ό μ°Έμ‘°νλ―λ‘ `42`κ° μΆλ ₯λλ€.
νμ΄ν ν¨μμμμ `this`μ λͺ μμ λ°μΈλ©
function createObject() {
// this.foo = 21
console.log('Inside `createObject`:', this.foo);
return {
foo: 42,
bar: () => console.log('Inside `bar`:', this.foo),
};
}
createObject.call({ foo: 21 }).bar(); // 21 μΆλ ₯
- νμ΄ν ν¨μ `bar`λ μμ μ€μ½νμ `this`λ₯Ό μ°Έμ‘°νλ―λ‘, `call`λ‘ μ€μ ν `this`κ° μλ, `createObject` ν¨μμ `this`λ₯Ό μ°Έμ‘°νκ² λλ€.
- λ°λΌμ `this.foo`λ `21`μ΄ μΆλ ₯λλ€.
- νμ΄ν ν¨μλ `this`κ° κ³ μ λμ΄ μμ΄, `call`μ΄λ `apply`λ‘ λ°μΈλ©μ λ³κ²½ν μ μλ€.
βΉοΈμ°Έκ³
[ASAC 6κΈ° κ°μμλ£]
'π»DEV-STUDY > JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
JavaScript CallBack ν¨μμ λΉλκΈ° μ²λ¦¬ Promise (0) | 2024.09.09 |
---|---|
JavaScript κ°μ²΄ μ μ λ° μ¬μ©κ³Ό JavaScript λͺ¨λ μμ€ν (0) | 2024.09.09 |
JavaScript ν¨μ μμ± λ°©λ² (1) | 2024.09.08 |
μλ°μ€ν¬λ¦½νΈ μμ§μ μν λ°©μ = ν¨μ μ€ν μ리 (0) | 2024.09.05 |
JavaScript λ³μ, ν¨μ μ μ λ° μ¬μ© (0) | 2024.09.05 |