var foo = function () {
console.dir(this);
};
// 1. ํจ์ ํธ์ถ
foo(); // window
// window.foo();
// 2. ๋ฉ์๋ ํธ์ถ
var obj = { foo: foo };
obj.foo(); // obj
// 3. ์์ฑ์ ํจ์ ํธ์ถ
var instance = new foo(); // instance
// 4. apply/call/bind ํธ์ถ
var bar = { name: 'bar' };
foo.call(bar); // bar
foo.apply(bar); // bar
foo.bind(bar)(); // bar
var foo = function(){
var boo = function(){
console.dir(this);
}
boo() // window
}
foo();
var object1 = {
name: "Kim",
sayName: function(){
console.log(this.name);
}
}
var object2 = {
name: "Pee"
}
object2.sayName = object1.sayName;
object1.sayName(); // Kim
object2.sayName(); // Pee
function Person(name) {
// ์์ฑ์ ํจ์ ์ฝ๋ ์คํ ์ -------- 1
this.name = name; // --------- 2
// ์์ฑ๋ ํจ์ ๋ฐํ -------------- 3
}
var me = new Person('Lee');
console.log(me.name); // Lee
JS์์ง์ ์๋ฌต์ ์ผ๋ก this๋ฅผ 1~3๋ฒ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ธ๋ฉํ๋ค. ํ์ง๋ง ๊ทธ ์ด์ธ์๋ ์ง์ ๋ฐ์ธ๋ฉํ๋ ๋ฐฉ๋ฒ๋ ์กด์ฌํ๋๋ฐ apply์ call์ด ๊ทธ๋ฌํ๋ค.
๊ทธ๋ฌ๋ ๋ช ์์ ์ธ ๋ฐ์ธ๋ฉ์ด๋ผ๊ณ ํ๋๋ผ๋ apply์ call์ ์ฝ๋ฐฑํจ์๊ฐ ์คํ๋๋ ์์ ์ global context๋ก ๋ฐ์ธ๋ฉ์ด๋๋ค. ์ด๋ apply์ call์ ์คํํ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์๊ตฌ์ ์ผ๋ก this๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ ์ ์๋ ๋จ์ ์ด ์๋ค.
๋ฐ๋ฉด์ bind() ๋ฉ์๋๋ this๊ฐ bind์ ์ ๊ณต๋ ๊ฐ์ผ๋ก ์ค์ ๋ ํจ์๋ฅผ ์์ฑํ๋ฉฐ, ํด๋น ํจ์์ ์ธ์๊ฐ์ ์์ ๋ํ ์๊ตฌ์ ์ผ๋ก ์ง์ ํ ์ ์๋ค.
var healthObj = {
name : "๋ฌ๋ฆฌ๊ธฐ",
lastTime : "PM10:12",
showHealth : function() {
setTimeout(function(){
console.log(this.name + "๋, ์ค๋์ " + this.lastTime + "์ ์ด๋์ ํ์
จ๋ค์");
}, 500);
}
}
healthObj.showHealth();
ํด๋น ์ฝ๋์ ๊ฒฐ๊ณผ๊ฐ์ ์ธ๋ป ๋ณด๋ฉด "๋ฌ๋ฆฌ๊ธฐ๋ ์ค๋์ PM10:12์ ์ด๋์ ํ์
จ๋ค์"๋ผ๊ณ ์๊ฐํ ์ ์์ง๋ง, ํด๋น ๊ฒฐ๊ณผ ๊ฐ์ "undefined๋, ์ค๋์ undefined์ ์ด๋์ ํ์
จ๋ค์"์ด๋ค.
์๋ํ๋ฉด setTimeout์ ๋น๋๊ธฐ ํจ์ ์ด๊ธฐ ๋๋ฌธ์, ํด๋น ํจ์๊ฐ ์คํ๋ ๋๋ ์ด๋ฏธ showHealth๊ฐ ๋ฐํ๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
var healthObj = {
name : "๋ฌ๋ฆฌ๊ธฐ",
lastTime : "PM10:12",
showHealth : function() {
setTimeout(runFunction, 500);
}
}
var runFunction = function(){
console.log(this.name + "๋, ์ค๋์ " + this.lastTime + "์ ์ด๋์ ํ์
จ๋ค์");
}.bind(healthObj);
healthObj.showHealth();
์์ ๊ฐ์ด runFunction์ healthObj์ bind๋ฅผ ํ๊ฒ ๋๋ฉด, this๋ฅผ ์๊ตฌ์ ์ผ๋ก ๋ฐ์ธ๋ํ๊ฒ ๋๋ค.