β οΈ μ 리ν λ΄μ©μ μ€νλ μλͺ»λ μ λ³΄κ° μμ μ μμ΅λλ€. λκΈλ‘ μλ €μ£Όμλ©΄ κ°μ¬νκ² μ΅λλ€.
ν¨μ μ€νμμμ thisλ μ μ κ°μ²΄λ€
μ μ κ°μ²΄λ μ€ννλ νκ²½λ§λ€ λ€λ¦
λλ€. μΉ λΈλΌμ°μ μμλ window
κ°μ²΄κ° μ μ κ°μ²΄κ° λλ€.
function sum(a, b) {
console.log(this === window); // => true
this.myNumber = 20; // μ μ κ°μ²΄μ 'myNumber'λΌλ μμ±μ μΆκ°
return a + b;
}
// sum()μ ν¨μ νΈμΆμ΄λ€.
// sum()μμμ thisλ μ μ κ°μ²΄λ€. (window)
sum(15, 16); // => 31
window.myNumber; // => 20
λν thisκ° ν¨μ μ€μ½ν λ°(μ΅μλ¨: μ μ μ€ν λ¬Έλ§₯)μμ μ¬μ©λμμ κ²½μ°, μ¬κΈ°μμ this μμ μ μ κ°μ²΄λ₯Ό μ°Έμ‘°νκ² λλ€.
console.log(this === window); // => true
this.myString = 'Hello World!';
console.log(window.myString); // => 'Hello World!'
μ격 λͺ¨λμμ ν¨μ μ€νμμμ thisλ undefinedμ΄λ€.
μλ°μ€ν¬λ¦½νΈμ μ격 λͺ¨λλ ES5μμ λ±μ₯νμμΌλ©°, μ½λ μμ μ±κ³Ό λ λμ μ€λ₯ κ²μ¦μ μ 곡νκΈ° μν΄ λ±μ₯νμλ€. use strict
λ₯Ό μ¬μ©νμ¬ μ격 λͺ¨λλ₯Ό μ μ©μν¬ μ μλ€.
function multiply(a, b) {
'use strict'; // μ격 λͺ¨λ
console.log(this === undefined); // => true
return a * b;
}
// multiply() ν¨μλ μ격 λͺ¨λλ‘ μ€νλ¨
// multiply()μμμ thisλ undefined
multiply(2, 5); // => 10
μ격 λͺ¨λμμλ thisμ κ°μ΄ window μ μ κ°μ²΄λ₯Ό μ°Έμ‘°νμ§ μκ³ undefined
λ‘ λ§λ λ€.
μ격 λͺ¨λλ νμ¬ μ€μ½ν λΏλ§ μλλΌ λ΄λΆ μ€μ½νμμλ μ μ©λ©λλ€.
function execute() {
'use strict'; // μ격 λͺ¨λ
function concat(str1, str2) {
// μ΄κ³³μμλ λ§μ°¬κ°μ§λ‘ μ격 λͺ¨λ
console.log(this === undefined); // => true
return str1 + str2;
}
// concat() ν¨μλ μ격 λͺ¨λ
// concat() ν¨μ μμμμ thisλ undefined
concat('Hello', ' World!'); // => "Hello World!"
}
execute();
λ΄λΆ ν¨μμ λ¬Έλ§₯μ μΈλΆ ν¨μμ λ¬Έλ§₯μ μμ‘΄νλ κ²μ΄ μλλΌ μ€μ§ μ€ν νκ²½μ μ’μ°λλ€.
var numbers = {
numberA: 5,
numberB: 10,
sum: function() {
console.log(this === numbers); // => true
function calculate() {
// thisλ window, μ격 λͺ¨λμμΌλ©΄ undefined
console.log(this === numbers); // => false
return this.numberA + this.numberB;
}
return calculate();
}
};
numbers.sum(); // NaN, μ격 λͺ¨λμμΌλ©΄ TypeError
numbers.sum()
μ κ°μ²΄ λ΄μ μλ λ©μλλ₯Ό μ€ννλ κ²μ΄λ€. λ°λΌμ thisλ numbers
λ₯Ό κ°λ¦¬ν¨λ€.
νμ§λ§ calculate()
λ λ©μλ μ€νμ΄ μλ ν¨μ μ€νμ΄λ€. μ΄ ν¨μμμμ thisλ window
λ₯Ό κ°λ¦¬ν¨λ€.(μ격λͺ¨λλΌλ©΄ undfined)
μ΄ λ¬Έμ μ ν΄κ²°μ±
μ€ νλλ‘ .call
λ©μλλ₯Ό μ¬μ©νλ λ°©λ²μ΄ μλ€.
var numbers = {
numberA: 5,
numberB: 10,
sum: function() {
console.log(this === numbers); // => true
function calculate() {
console.log(this === numbers); // => true
return this.numberA + this.numberB;
}
// λ¬Έλ§₯μ μμ νκΈ° μν΄ .call() λ©μλλ₯Ό μ μ©
return calculate.call(this);
}
};
numbers.sum(); // => 15
ν¨μ μ€νκ³Ό λ©μλ μ€νμ μλ‘ λ€λ₯΄λ€. κ°μ₯ ν° μ°¨μ΄μ μ λ©μλ μ€νμ μμ± μ κ·Όμλ₯Ό μ¬μ©νμ¬ νΈμΆνλ€.
thisλ λ©μλ μ€νμμ λ©μλλ₯Ό μμ νκ³ μλ κ°μ²΄μ΄λ€.
var myDog = Object.create({
sayName: function() {
console.log(this === myDog); // => true
return this.name;
}
});
myDog.name = 'Milo';
// λ©μλ μ€ν. μ¬κΈ°μμ thisλ myDog.
myDog.sayName(); // => 'Milo'
ES6μ class μμ½μ΄μμμ thisλ μΈμ€ν΄μ€ μμ μ κ°λ¦¬ν¨λ€.
class Planet {
constructor(name) {
this.name = name;
}
getName() {
console.log(this === earth); // => true
return this.name;
}
}
var earth = new Planet('Earth');
// λ©μλ μ€ν. μ¬κΈ°μμ thisλ earth.
earth.getName(); // => 'Earth'
μμ±μ μ€νμμμ thisλ μλ‘κ² λ§λ€μ΄μ§ κ°μ²΄μ΄λ€.
function Foo () {
console.log(this instanceof Foo); // => true
this.property = 'Default Value';
}
// μμ±μ μ€ν
var fooInstance = new Foo();
fooInstance.property; // => 'Default Value'
μ¬κΈ°μ μ κΉ, λ§μ½ new
λ₯Ό μ¬μ©νμ§ μλλ€λ©΄ ν¨μ μ€νμ΄ λλ―λ‘ thisλ windowκ°μ²΄λ₯Ό κ°λ¦¬ν€κ² λλ€.
function Vehicle(type, wheelsCount) {
this.type = type;
this.wheelsCount = wheelsCount;
return this;
}
// Function invocation
var car = Vehicle('Car', 4);
car.type; // => 'Car'
car.wheelsCount // => 4
car === window // => true
κ°μ μ€νμΈ
.call()
κ³Ό.apply()
λ©μλμμλ 첫 λ²μ§Έ λ§€κ° λ³μλ‘ thisλ₯Ό λ°λλ€.
λ λ©μλλ λ겨λ°λ μΈμμ νμλ§ λ€λ₯Ό λΏ, thisλ₯Ό νΉμ κ°μ²΄μ λ°μΈλ©νμ¬ ν¨μλ₯Ό νΈμΆνλ μν μ νλ€.
callκ³Ό applyμ κ°μ₯ ν° μ°¨μ΄μ μ callλ©μλλ μΈμλ₯Ό κ·Έλλ‘ λκΈΈ μ μμ§λ§ applyλ©μλλ ν¨μμ μ λ¬ν μΈμλ€μ λ°°μ΄ ννλ‘ μ λ¬ν΄μΌνλ€λ κ²μ΄λ€.
λΉμΈλ© ν¨μλ μΌλ° ν¨μμ
.bind()
λ©μλκ° μ μ©λ κ²μ μλ―Ένλ€. bind λ©μλμ 첫 λ²μ§Έ μΈμλ‘λ λ°μΈλ© ν¨μμ μ μ©ν thisλ₯Ό λ°λλ€. κ·Έλ¦¬κ³ ν¨μλ₯Ό νΈμΆνλ κ²μ΄ μλλΌ μλ‘μ΄ ν¨μλ₯Ό λ°ννλ€.
function multiply(number) {
'use strict';
return this * number;
}
// λ¬Έλ§₯μ μ§μ ν΄μ λ°μΈλ© ν¨μλ₯Ό μμ±
var double = multiply.bind(2);
// λ°μΈλ© ν¨μλ₯Ό μ€ν
double(3); // => 6
double(10); // => 20
νμ΄ν ν¨μλ ν¨μκ° μ΄λ»κ² νΈμΆλμλμ§μ λ°λΌ thisμ λ°μΈλ©ν κ°μ²΄κ° λμ μΌλ‘ κ²°μ λλ€. νμ΄ν ν¨μμ this μΈμ λ μμ μ€μ½νμ thisλ₯Ό κ°λ¦¬ν¨λ€
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
log() {
console.log(this === myPoint); // => true
setTimeout(()=> {
console.log(this === myPoint); // => true
console.log(this.x + ':' + this.y); // => '95:165'
}, 1000);
}
}
var myPoint = new Point(95, 165);
myPoint.log();
function Period (hours, minutes) {
this.hours = hours;
this.minutes = minutes;
}
Period.prototype.format = () => {
console.log(this === window); // => true
return this.hours + ' hours and ' + this.minutes + ' minutes';
};
var walkPeriod = new Period(2, 30);
walkPeriod.format(); // => 'undefined hours and undefined minutes'
formatμ νμ΄ν ν¨μκ³ , μ μμ μ μ λμκΈ° λλ¬Έμ μ¬κΈ°μμ thisλ μμ 컨ν μ€νΈμΈ μ μ κ°μ²΄ windowλ₯Ό κ°λ¦¬ν€κ² λλ€.
// Bad
const person = {
name: 'Lee',
};
Object.prototype.sayHi = () => console.log(`Hi ${this.name}`);
person.sayHi(); // Hi undefined
const Foo = () => {};
// νμ΄ν ν¨μλ prototype νλ‘νΌν°κ° μλ€
console.log(Foo.hasOwnProperty('prototype')); // false
const foo = new Foo(); // TypeError: Foo is not a constructor
νμ΄ν ν¨μλ μμ±μ ν¨μκ° κ°μ§κ³ μμ΄μΌ ν prototype νλ‘νΌν°κ° μλ€.
// Bad
var button = document.getElementById('myButton');
button.addEventListener('click', () => {
console.log(this === window); // => true
this.innerHTML = 'Clicked button';
});
addEventListener ν¨μμ μ½λ°± ν¨μλ₯Ό νμ΄ν ν¨μλ‘ μ μνλ©΄ thisκ° μμ 컨νμ€νΈμΈ μ μ κ°μ²΄ windowλ₯Ό κ°λ¦¬ν¨λ€.
this μ΄λ κ²½μ°μ μ΄λ»κ² μ μ©λλμ§ νλνλ 체ν¬ν μ μμλ€. νμ΄ν ~