ํ๋ก๊ทธ๋๋จธ์ค ๊ณผ์ ๊ด ๊ณ ์์ด ์ฌ์ง ๊ฒ์ ์ฌ์ดํธ๋ฅผ ์งํํ๋ฉฐ ์ฌ์ฉํ JavaScript
์์ํ๋ฉฐ
ํ๋ก๊ทธ๋๋จธ์ค ๊ณผ์ ๊ด์ ์๋ ๊ณ ์์ด ์ฌ์ง ๊ฒ์ ์ฌ์ดํธ ๊ณผ์ ๋ฅผ ์งํํ๋ฉฐ JavaScript ๋ฉด์ ์ง๋ฌธ์ผ๋ก ์์ฃผ ๋ง๋๋ ๊ฐ๋ ์ ๋ํด ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
JavaScript
this
๊ธฐ๋ณธ ๋ฐ์ธ๋ฉ (์ ์ญ๊ฐ์ฒด)
์ผ๋ฐ์ ์ผ๋ก this๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์ ์ ์ญ ๊ฐ์ฒด์
๋๋ค. (๋ธ๋ผ์ฐ์ ์ window ๊ฐ์ฒด)
this์ ์ฒซ๋ฒ์งธ ๋์ ๋ฐฉ์์ ์ ์ญ ๊ฐ์ฒด(window)๋ฅผ context ๊ฐ์ฒด๋ก ๊ฐ๋ ๊ฒ ์
๋๋ค.
์์์ ๋ฐ์ธ๋ฉ
function zzz() {
console.log(this.a);
}
var foo = {
a: 20,
bar: zzz,
bla: function() {
console.log(this.a);
}
}
foo.bar() // 20
foo.bla() // 20์ด๋ค ๊ฐ์ฒด(foo)๋ฅผ ํตํด ํจ์๊ฐ ํธ์ถ๋๋ค๋ฉด ์ด๋์ this์ context ๊ฐ์ฒด๋ ํธ์ถํ ์ด๋ค ๊ฐ์ฒด(foo)์
๋๋ค.
var b = 100;
this.blabla = foo.bar;
this.blabla(); // 100์ฒซ ๋ฒ์งธ ์ฝ๋์ ์ ์ญ ์ค์ฝํ์ ์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค๋ฉด this์ context ๊ฐ์ฒด๋ ๋ค์ ์ ์ญ ๊ฐ์ฒด(window)๊ฐ ๋ฉ๋๋ค.
์ ์ญ ์ค์ฝํ์์ ์์ฑํ ๋ณ์๋ ์ ์ญ ๊ฐ์ฒด์ ๋ฑ๋ก๋๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ช ์์ ๋ฐ์ธ๋ฉ
function foo() {
console.log(this);
}
var obj = { name: 'jigeol' };
foo.call(obj);call() ๋ฉ์๋๋ ์ฒซ๋ฒ์งธ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ ๊ฒ์ด this context ๊ฐ์ฒด์
๋๋ค. ์ด ์ธ์๋ apply, bind ๋ฉ์๋๋ฅผ ํตํด this context ๊ฐ์ฒด๋ฅผ ์ง์ ํด์ฃผ๋ ๋ฐฉ์์ ๋ช
์์ ๋ฐ์ธ๋ฉ์ด๋ผ๊ณ ํฉ๋๋ค.
new ๋ฐ์ธ๋ฉ
function foo(a) {
this.a = a;
this.b = 20;
}
var bar = new foo(2);์๋ฐ์คํฌ๋ฆฝํธ์์ new ํค์๋๋ ์๋ฐ์ ํด๋์ค ์ธ์คํด์ค ํ๊ฐ ์๋๋ผ foo ํจ์ ์คํ๊ณผ ๊ฐ์ต๋๋ค.
๋ฐ์ธ๋ฉ์ ์ฐ์ ์์
new ๋ฐ์ธ๋ฉ >= ๋ช
์์ ๋ฐ์ธ๋ฉ >>>> ์์์ ๋ฐ์ธ๋ฉ >= ๊ธฐ๋ณธ ๋ฐ์ธ๋ฉ
๊ธฐ๋ณธ ๋ฐ์ธ๋ฉ์
new๋ฐ์ธ๋ฉ, ๋ช ์์ ๋ฐ์ธ๋ฉ, ์์์ ๋ฐ์ธ๋ฉ ์ผ์ด์ค๊ฐ ์์ ๊ฒฝ์ฐ ๋ฐ์๋์ง ์์ต๋๋ค.
new ๋ฐ์ธ๋ฉ & ๋ช
์์ ๋ฐ์ธ๋ฉ VS ์์์ ๋ฐ์ธ๋ฉ
function foo(bar) {
this.a = bar;
}
var obj1 = {
foo: foo
}
obj1.foo(2) // ์์์ ๋ฐ์ธ๋ฉ
console.log(obj1.a) // 2
var obj2 = {};
obj1.foo.call(obj2, 3); // ์์์ ๋ฐ์ธ๋ฉํ ํ obj2๋ผ๊ณ ๋ช
์์ ๋ฐ์ธ๋ฉ
console.log(obj1.a) // 2
console.log(obj2.a) // 3
var obj3 = new obj1.foo(10) // new ๋ฐ์ธ๋ฉ
console.log(obj1.a) // 2
console.log(obj2.a) // 3
console.log(obj3.a) // 10์์์ ๋ฐ์ธ๋ฉ ํ ๊ฐ์ฒด(obj1)๋ฅผ ๋ช
์์ ๋ฐ์ธ๋ฉ & new๋ฐ์ธ๋ฉ์ ํด๋ณด์๋ obj1 ๊ฐ์ฒด์ ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ค(obj2, obj3)์ ์ ์ฉ๋ฉ๋๋ค.
new ๋ฐ์ธ๋ฉ VS ๋ช
์์ ๋ฐ์ธ๋ฉ
function foo(something) {
this.a = something;
}
var obj1 = {};
var bar = foo.bind(obj1); // ๋ช
์์ ๋ฐ์ธ๋ฉ
bar(2);
console.log(obj1.a); // 2
var baz = new bar(3); // new ๋ฐ์ธ๋ฉ
console.log(obj1.a); // 2
console.log(baz.a); // 3Arrow Function
ํ์ดํ ํจ์๋ก ํํํ ์ ์๋ ๋ฌธ๋ฒ์์์ this๋ ํน๋ณํ๊ฒ ์์ฉํฉ๋๋ค.
ํ์ดํ ํจ์๊ฐ ์ ์ธ๋ ์ค์ฝํ์ this context ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
var a = 10;
var b = 20;
var obj = {
a: 1,
func: () => console.log(this.a)
}
obj.func(); // 10
// Arror Function
function test() {
console.log(this);
return () => console.log(this.b);
}
var f1 = test();
f1(); // 20
var context = { b: 999 };
var f2 = test.call(context);
f2(); // 999
// function()
function test2() {
console.log(this);
return funtion() {
console.log(this.b);
}
}
var f3 = test2();
f3(); // 20
var f4 = test2.call(context);
f4(); // 20์ด๋ฒคํธ ๋ฒ๋ธ๋ง & ์ด๋ฒคํธ ์บก์ณ๋ง
addEventListener
๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฒคํธ๋ ํ์์์์์๋ถํฐ ์์์์๋ก ์ ๋ฌ๋ฉ๋๋ค.
<section class="container">
<div class="inner">
<button class="close">๋ฒํผ์ด์์ฉ</button>
</div>
</section>document.getElementsByClassName("container").addEventListener('click', () => {
console.log("I'm container!");
})
document.getElementsByClassName("inner").addEventListener('click', () => {
console.log("I'm inner!");
})
document.getElementsByClassName("close").addEventListener('click', () => {
console.log("I'm close button!");
})์ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค๋ฉด ๋ฒํผ์ ํด๋ฆญํ์ ๋ ์๋์ ๊ฐ์ ์ฝ์์ ๋ชจ์ต์ ๋ณผ ์ ์์ต๋๋ค.
I'm close button!
I'm inner!
I'm container!addEventListener๋ ์ธ๋ฒ์งธ ์ธ์๋ก useCapture๋ผ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ๊ณ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ผ๋ก false์ด๊ณ ์บก์ณ๋ง์ ์ฌ์ฉํ ๊ฑด์ง๋ฅผ ์ค์ ํ๋ ํ๋ผ๋ฏธํฐ์
๋๋ค.
์ ์ฝ๋ ์ค ์ด๋ ๊ฒ๋ง ๋ฐ๊พผ๋ค๋ฉด?
document.getElementsByClassName("container").addEventListener('click', () => {
console.log("I'm container!");
}, true)๊ฒฐ๊ณผ๋ ์ด๋ ์ต๋๋ค.
I'm container!
I'm close button!
I'm inner!