๋ชฉ์ฐจ
JS์ this ํค์๋์ ๋ํด์ ์์๋ณด์. (4๊ฐ์ง)
0. this ํค์๋์ ์๋ฏธ
this ํค์๋๋ ๋ค์ํ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๊ทธ ์๋ฏธ๋ ์ฌ์ฉํ๋ ์์น์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค. (์ฌ์ค ์๋์๋..?)
1-1. global์์ ์ฌ์ฉ & ์ผ๋ฐ(์ ์ญ) ํจ์์์ ์ฌ์ฉ -> window
๋จผ์ ๊ฐ์ฅ ์์ ์์น์์ this ํค์๋๋ฅผ ์ฝ์์์ ํ์ธํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
window๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
+) window๋?
- ๋ชจ๋ ์ ์ญ๋ณ์, ํจ์, DOM์ ๊ด๋ฆฌํ๋ ์ ์ญ๊ฐ์ฒด!
- ์๋ฅผ๋ค์ด ์ ์ญ๋ณ์๋ฅผ ์์ฑํ๋ฉด window ์์ ์์ฑ๋๋ ๊ฒ์ด๋ค.
1-2. strict mode์ผ๋ ์ผ๋ฐ ํจ์ ์์์ ์ฌ์ฉ -> undefined
'use strict'
'use strict'๋ผ๋ ํค์๋๋ฅผ ์ต์๋จ์ ์ถ๊ฐํ๋ฉด strict ๋ชจ๋๋ก ์์ฑํ ์ ์๋ค.
strict ๋ชจ๋๋ฅผ ์ด์ฉํ๋ฉด ์์ ํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ฐ
์๋ฅผ ๋ค์ด let ๋ฑ์ ํค์๋ ์์ด ๋ณ์ ์ ์ธ ๋ฑ์ ๋ฐฉ์งํ ์ ์๋ค.
ํด๋น ๋ชจ๋๋ฅผ ์ฌ์ฉํ ๋ ์ผ๋ฐ ํจ์ ๋ด๋ถ์์ this๋ฅผ ํ์ธํด๋ณด๋ฉด
undefined๋ผ๋ ๊ฐ์ ๋ฐํํ๋ค.
2. object ๋ด๋ถ ํจ์(๋ฉ์๋)์์ this -> ๋ถ๋ชจ
๊ฐ์ฒด ๋ด๋ถ์์ this๋ '๋ถ๋ชจ'๋ฅผ ๋ฐํํ๋ค. ์ฆ, ํ์ฌ ์ํ ์์น๋ฅผ ๋ํ๋ธ๋ค.
1_๋ฉ์๋์์ this
๊ฐ์ฒด์ ๋ฉ์๋์์ this๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด ์์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
2_ํ๋จ๊ณ ๋?
์ด๋ฌํ ๊ฒฝ์ฐ์๋ ์ญ์ ๋ถ๋ชจ๋ฅผ ์๋ฏธํ๋
obj.hello๋ฅผ ๋ฐํํ๋ ๊ฒ์ ์ ์ ์๋ค.
๋ค๋ฅธ๋ฐฉ๋ฒ โผ
์๋์ ๋ฐฉ๋ฒ๋ ๋๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
์ฌ๊ธฐ์ ์ ์ ์๋ ์ฌ์ค์
window ์ญ์ ๊ฐ์ฒด์ด๋ฏ๋ก ๋ด๋ถ์์ this๋ฅผ ํธ์ถํ๋ฉด
๊ทธ๊ฒ์ด ์ํด์๋ ๊ฐ์ฒด์ธ window๋ฅผ ๋ฐํํ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์๋์ ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋๊ฐ์ window๋ฅผ ๋ฐํํ๋ค.
function hello(){
console.log(this);
}
window.hello = function(){console.log(this)};
์ ๋ฆฌํ์๋ฉด,
this๋ ๊ฐ์ฒด ๋ด์ ๋ฉ์๋(ํจ์)์์ ์ฌ์ฉํ๋ฉด ๋ฉ์๋์ ๋ถ๋ชจ ๊ฐ์ฒด๋ฅผ ์ถ๋ ฅํ๋ค.
3. constructor ์์์ this -> ์์ฑ๋ ์ธ์คํด์ค
JS์์ ๋น์ทํ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ถ์๋ constructor๋ฅผ ์ด์ฉํ๋ค.
์์
function Apple(){
this.author = "Kassid";
}
์ด๋ ์ฌ์ฉํ๋ this๋ ์๋ก ์์ฑ๋ ๊ฐ์ฒด(์ธ์คํด์ค)๋ฅผ ์๋ฏธํ๋ค.
์์ฒ๋ผ ์์ฑ๋ ์ธ์คํด์ค์ ๊ฐ์ด ์ ์ฅ๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
4. ์ด๋ฒคํธ ๋ฆฌ์ค๋์์ this -> e.currentTarget
์์์ ๋ฑ๋กํ ์ด๋ฒคํธ ๋ฆฌ์ค๋์์ this๋ e.currentTarget๊ณผ ์๋ฏธ๊ฐ ๋์ผํ๋ค.
์์
<div class="box" style="width: 100px; height: 100px; background: #efefef;"></div>
<script>
document.getElementsByClassName("box")[0].addEventListener("click", function(e){
console.log(this);
console.log(e.currentTarget);
})
</script>
์ด์ฒ๋ผ ๋ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ผํ ๊ฒ์ ์ ์ ์๋ค.
Q1. ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์์ ์ฝ๋ฐฑํจ์์์ this -> window
์ด๋ฒคํธ ๋ฆฌ์ค๋ ์์ ์ฝ๋ฐฑํจ์์์ this๋ ์ด๋ค ๊ฒ์ ๋ฐํํ ๊น?
์์
document.getElementsByClassName("box")[0].addEventListener("click", function(e){
let arr = [1,2,3];
arr.forEach(function(a){
console.log(this);
})
})
์ด์ฒ๋ผ window๋ฅผ ๋ฐํํ๋ค.
์์์ ๋ณด์๋ 4๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ํ๋์ฉ ๋ฐ์ ธ๋ณด์์๋
3๋ฒ์ธ constructor๊ฐ ์๋๊ณ ,
4๋ฒ์ธ eventListener๋ ๋ฌผ๋ก ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์์ ์๊ธด ํ์ง๋ง, ๊ทธ ๋ด๋ถ์ ์๋ก์ด ํจ์ ๋ด๋ถ์ด๋ฏ๋ก 4๋ฒ๋ ์๋๋ค.
๊ทธ๋ ๋ค๋ฉด 1, 2๋ฒ์ ๊ฒฝ์ฐ์ธ๋ฐ
์ฝ๋ฐฑํจ์๋ ์ด๋ฒคํธ๋ฆฌ์ค๋์ ๋ฉ์๋๊ฐ ์๋ ๊ทธ์ ์ผ๋ฐํจ์์ด๋ฏ๋ก
window๋ฅผ ๋ฐํํ๋ ๊ฒ์ด๋ค.
Q2. ๊ฐ์ฒด ๋ด์ ์ฝ๋ฐฑํจ์์์ this -> window
์ด๋ฒ์๋ ๊ฐ์ฒด ๋ด์ ์ฝ๋ฐฑํจ์์์ this๋ ์ด๋ค ๊ฐ์ ๋ฐํํ ์ง ์์๋ณด์.
let obj = {
arr : [1,2,3],
func : function(){
obj.arr.forEach(function(a){
console.log(this)
})
}
}
obj.func()
์ญ์ window๋ฅผ ๋ฐํํ๋ค.
๊ทธ ์ด์ ๋ this๊ฐ ์ํ ํจ์์ ์์น๋ฅผ ํ์ธํ๋ฉด ๋๋๋ฐ ์ญ์ ์ผ๋ฐํจ์์ด๋ฏ๋ก ๊ทธ๊ฒ์ ๋ถ๋ชจ์ธ window๋ฅผ ๋ฐํํ๋ ๊ฒ์ด๋ค.
Q3. arrow function ์์์์ this
์ด๋ฒ์๋ arrow function์์ this๋ฅผ ์์๋ณด์.
let c = {
func: function(){
let a = [1];
a.forEach(()=>{
console.log(this);
})
}
}
c.func()
Q2์ ๊ฒฐ๊ณผ์ ๋ค๋ฅด๊ฒ ์ด๋ฒ์๋ c.func๋ฅผ ๋ฐํํ ๊ฒ์ ์ ์ ์๋ค.
์ด๋ arrow function์ ํน์ง์ผ๋ก,
์ผ๋ฐํจ์์ ๋ค๋ฅด๊ฒ ๋ ๋ฆฝ์ ์ธ ๊ฒ์ด ์๋
ํด๋น ํจ์ ์ธ๋ถ์ this์ ๋์ผํ ๊ฐ์ ๋ฐํํ๋ค.
let c = {
func: function(){
console.log(this); //์ธ๋ถ์ this
let a = [1];
a.forEach(()=>{
console.log(this); //๋ด๋ถ์ this
})
}
}
c.func()
์ง๊ธ๊น์ง this์ ๋ํด์ ์์๋ณด์๋ค.
this๋ ๊ทธ๊ฒ์ด ์์นํ๋ ๊ณณ๊ณผ ํจ์์ ์ข ๋ฅ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค๋ ๊ฒ์ ์ผ๋ํด๋์ด์ผ ํ๋ค.
๋ฐ๋ผ์ ๊ผญ ํ์ํ ๊ฒ์ด ์๋๋ผ๋ฉด ๋ช ์์ ์ธ ๋ฐฉ๋ฒ์ ํํ๋ ๊ฒ์ด ๋ ์ข์ ์ฝ๋๊ฐ ์๋๊น? ํ๋ ์๊ฐ์ด ๋ค์๋ค.
'๐ | WEB DEV > Vanilla JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JS_๋ฌธ๋ฒ (๊ฐ์ธ)_ ๋ณ์ ์ด์ ๋ฆฌ (0) | 2023.08.04 |
---|---|
JS_๊ธฐ๋ณธ ๋ฌธ๋ฒ (28)_ Arrow function (0) | 2023.08.02 |
JS_๊ธฐ๋ณธ ๋ฌธ๋ฒ (26)_ ์ ๊ทผ์ ํ๋กํผํฐ์ privateํ๋ (0) | 2023.04.10 |
JS_๊ธฐ๋ณธ ๋ฌธ๋ฒ (25)_ ํด๋์ค (1) | 2023.04.02 |
JS_๊ธฐ์ (3)_ Hoisting(ํธ์ด์คํ ) ๋ฟ์๊ธฐ (0) | 2023.03.31 |
๋๊ธ