this๋ ๊ฐ์ฒด์ ํ๋กํผํฐ
๋ ๋ฉ์๋
๋ฅผ ์ฐธ์กฐํ๊ธฐ ์ํ ์๊ธฐ ์ฐธ์กฐ ๋ณ์ ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๊ฐ์ฒด์ ๋ฉ์๋ ๋ด๋ถ ๋๋ ์์ฑ์ ํจ์ ๋ด๋ถ์์๋ง ์๋ฏธ๊ฐ ์๋ค.
(์ฐธ๊ณ ) strice mode์์ ์ผ๋ฐ ํจ์ ๋ด๋ถ์ this๋ undefined๋ก ๋ฐ์ธ๋ฉ๋๋ค. ์ผ๋ฐ ํจ์ ๋ด๋ถ์์ this๋ ์ฌ์ฉํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ผ๋ฐ ํจ์ ๋ด this ->
window ๊ฐ์ฒด
๊ฐ์ฒด obj ๊ฐ์ ํจ์ this ->๊ฐ์ฒด obj
๋ฅผ ์๋ฏธ
ํ์ดํ ํจ์ ๋ด๋ถ this ->์ธ๋ถ this
๊ฐ ์ฌ์ฉ
์์ฑ์ ๋ด์์ this ->๋ด ์์
์ด๋ฒคํธ๋ฆฌ์ค๋ ๋ด this ->e.currnetTarget
(์ด๋ฒคํธ ๋์์ค์ธ ๊ณณ, ๋๋ถ๋ถ ํ๊ทธ)
์ผ๋ฐ ํจ์์ ์ ์ฅ์์ this๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ์ ์ต์๋จ ๊ฐ์ฒด์ธ window๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
<script>
console.log(this); //Window {0: global,...
</script>
<script>
function func(){
console.log(this); ////Window {0: global,...
}
</script>
window ๊ฐ์ฒด๋ฅผ ํผ์ณ๋ณด๋ฉด window ํจ์๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ๊ณ ์๋ ๋ด์ฅ ํจ์๋ค์ ์ถ๋ ฅํด์ฃผ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ค๋ธ์ ํธ ๋ด ํจ์ ์์์ ์ฐ๋ฉด ( = func ๋ฉ์๋์์ this ์ถ๋ ฅ )
๊ทธ ํจ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ค๋ธ์ ํธ๋ฅผ ๋ปํ๋ค. ( = obj
)
var obj = {
name : 'me',
func : function(){
console.log(this)
}
}
obj.func(); // {name: 'me', func: ฦ}
์๋์ ๊ฒฝ์ฐ func2 ๋ฉ์๋์์ this ์ถ๋ ฅ์, this๋ func
๋ฅผ ๋ปํจ
var obj = {
name : 'me',
func : {
func2 : function(){
console.log(this)
}
}
}
obj.func.func2(); // {func2: ฦ}
ํ์ดํ ํจ์ ๋ด๋ถ์ this๊ฐ์ ์ธ๋ถ this ๊ฐ์ ๋ณํ์ํค์ง ์๊ณ ์ธ๋ถ this ๊ฐ์ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํ๋ค.
console.log(this) // Window
var obj = {
name : 'su',
func : () => {
console.log(this) // Window
}
}
obj.func();
์ฆ, 1๋ฒ ๊ฐ๋
๊ณผ
2๋ฒ ๊ฐ๋
์ ์ข
ํฉํด์ ๋ดค์ ๋ this๋ ๋์ผํ ๊ฐ๋
์ด๋ค.
ํจ์๋ ๋ณ์๋ฅผ ์ ์ญ ๊ณต๊ฐ์์ ๋ง๋ค๋ฉด ๋ณด์ด์ง ์๋ Window ๊ฐ์ฒด์ ๋ณด๊ดํ๋ค.
function ๊ธฐ๊ณ(){
this.์ด๋ฆ = 'kim';
}
var newObj = new ๊ธฐ๊ณ();
console.log(newObj); // construct{์ด๋ฆ:'kim'}
e.currnetTarget์ ์ง๊ธ ์ด๋ฒคํธ ๋์ํ๋ ๊ณณ์ ๋ํ๋ธ๋ค.
<button id='๋ฒํผ'>๋ฒํผ</button>
document.getElementById('๋ฒํผ').addEventListener('click',function(e){
console.log(this);
console.log(e.currentTarget);
// <button id='๋ฒํผ'>๋ฒํผ</button>
// <button id='๋ฒํผ'>๋ฒํผ</button>
})
<button id='๋ฒํผ'>๋ฒํผ</button>
document.getElementById('๋ฒํผ').addEventListener('click',function(e){
var array = [1,2,3];
array.forEach(function(a){
console.log(this)
});
})
์ ๋ต์ Window ๊ฐ์ฒด๊ฐ ์ถ๋ ฅ๋๋ค.
addEventListener ํจ์์ ์ฝ๋ฐฑํจ์๋ก ์ฐ์์ง๋ง
์ด๋ฒคํธ ๋ฆฌ์ค๋, ์์ฑ์ ๋ด๋ถ์์ ์ด ๊ฒ๋ ์๋๊ณ ,
ํน์ ํจ์ ๋ด๋ถ์์ ์ด ๊ฒ๋ ์๋๋ฏ๋ก
function(a){
console.log(this)
});
์ด ํจ์๋ ์๋ฐํ ๋งํด์ ์ ์ญ ํจ์์ ํด๋นํ๋ค.
var obj = {
์ด๋ฆ๋ค :[ '๊น','์ด','๋ฐ'],
ํจ์ : function(){
console.log(this) // this
obj.์ด๋ฆ๋ค.forEach(function(){console.log(this)}) }
}
obj.ํจ์();
// Window
// Window
// Window
obj.ํจ์();
๋ฅผ ์คํ์ํค๋ฉด
function(){
obj.์ด๋ฆ๋ค.forEach(function(){console.log(this)}) }
}
์ด ํจ์๊ฐ ์คํ๋ ๊ฒ์ด๋ค. ์ด ํจ์๋ ์ฌ์ค์ ๊ทผ๋ณธ์๋^^ ์ผ๋ฐ ํจ์์ ํด๋น๋๋ค. ์ ์ผ์ด์ค๋ ๋ง์ฐฌ๊ฐ์ง.
๋ฐ๋ผ์ ๋ฐ๋ณต๋ฌธ์ ๊ธธ์ด๋งํผ window ๊ฐ์ฒด๊ฐ ์ธ ๋ฒ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
var obj = {
์ด๋ฆ๋ค :[ '๊น','์ด','๋ฐ'],
ํจ์ : function(){
console.log(this) // (2) ์ด this๋ฅผ ์๋ฏธํจ
obj.์ด๋ฆ๋ค.forEach(() =>{
console.log(this)}) // (1) ์ด this๋
}
}
obj.ํจ์();
// {์ด๋ฆ๋ค:Array(3), ํจ์...}
// {์ด๋ฆ๋ค:Array(3), ํจ์...}
// {์ด๋ฆ๋ค:Array(3), ํจ์...}
(1) ์ผ๋ฐ ํจ์์์ this๊ฐ์ ๋ฐ๋ก ๊ทผ์ฒ์ function์ ์ฐพ์๋ณด๋ฉด ๋๋ค.
์๋ this๋ ์๋ฌด๊ฒ๋ ์๋ ์ผ๋ฐ function์ ๊ฐ๋ฆฌํค๋ฏ๋ก window๋ฅผ ๊ฐ๋ฆฌํค๋ ์
์ด๋ค.
<button id="๋ฒํผ">๋ฒํผ์ด์์</button>
<script>
document.getElementById('๋ฒํผ').addEventListener('click',function(){
setTimeout(function(){console.log(this.innerHTML)},1000);
}) // ์ด this๋ setTimeout ๋ด๋ถ์ ์๋ this๊ฐ, ์ฆ ์๋ฌด๊ฒ๋ ๊ฐ๋ฆฌํค์ง ์๋ ํจ์์ด๋ค.
</script>
์ผ๋ฐ ํจ์๋ก ์์ฑํ๋๋ผ๋ฉด ๋ฐ์ ์๋ฌด ์๊ด์๋ window๊ฐ์ฒด์ innerHTML๊ฐ์ ๋ฐ์์ค๋ฏ๋ก undefined๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
(2) ํ์ง๋ง arrow function ํํ๋ก ์ ๊ฒ๋๋ฉด ํจ์ ๋ฐ์ ๊ฐ์ ๊ฐ๋ฆฌํค๋ฏ๋ก document.getElementById('๋ฒํผ')
์ ์ ๋๋ก ๊ฐ๋ฆฌํฌ ์ ์๋ค.
<button id="๋ฒํผ">๋ฒํผ์ด์์</button>
<script>
document.getElementById('๋ฒํผ').addEventListener('click',function(){
setTimeout(()=>{console.log(this.innerHTML)},1000);
}) // ์ด this
</script>
(3) ํน์ this๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ผ๋ฐ ํจ์๋ก ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์๊ธฐ๋ ํ๋ค.
<button id="๋ฒํผ">๋ฒํผ์ด์์</button>
<script>
document.getElementById('๋ฒํผ').addEventListener('click',function(){
var ๋ฒํผ = this;
setTimeout(function(){console.log(๋ฒํผ.innerHTML)},1000);
})
</script>