[Js] this | ํจ์ํธ์ถ | ๋ฉ์๋์ ํธ์ถ | allpy, call | ๊ฐ์ฒด
- -
ํด๋น ํฌ์คํ ์ "์ํ์ฝ๋ฉ"์ ์ด๊ณ ์ ๋์ ๊ฐ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฆฐ ๊ฒ์๊ธ ์ ๋๋ค.
์์ ์ ์ธ ์ฉ๋๊ฐ ์๋, ๊ฐ์ธ ๊ณต๋ถ ์ ๋ฆฌ ๋ชฉ์ ์ผ๋ก ์ฌ๋ฆฌ๋ ๊ธ์์ ๋ฏธ๋ฆฌ ์๋ฆฝ๋๋ค.
this
this๋ ํจ์ ๋ด์์ ํจ์ ํธ์ถ ๋งฅ๋ฝ(context)๋ฅผ ์๋ฏธํ๋ค. ๋งฅ๋ฝ์ด๋ผ๋ ๊ฒ์ ์ํฉ์ ๋ฐ๋ผ์ ๋ฌ๋ผ์ง๋ค๋ ์๋ฏธ์ธ๋ฐ ์ฆ ํจ์๋ฅผ ์ด๋ป๊ฒ ํธ์ถํ๋๋์ ๋ฐ๋ผ์ this๊ฐ ๊ฐ๋ฆฌํค๋ ๋์์ด ๋ฌ๋ผ์ง๋ค๋ ๋ป์ด๋ค. ํจ์์ ๊ฐ์ฒด์ ๊ด๊ณ๊ฐ ๋์จํ ์๋ฐ์คํฌ๋ฆฝํธ์์ this๋ ์ด ๋์ ์ฐ๊ฒฐ์์ผ์ฃผ๋ ์ค์ง์ ์ธ ์ฐ๊ฒฐ์ ์ ์ญํ ์ ํ๋ค.
์ฆ this๋ ์ฝ์๋ ๋ณ์๋ผ๊ณ ํ ์ ์์ผ๋ฉฐ, ํจ์์์์ ์ฌ์ฉํ ์ ์๋ ์ผ์ข ์ ๋ณ์์ด๋ค.
์ด ๊ฐ์ ์๋ฏธ๋ ํจ์๋ฅผ ์ด๋ป๊ฒ ํธ์ถํ๋๋์ ๋ฐ๋ผ์ ๋ฌ๋ผ์ง๋ค๋ ๋ป์ด๋ค.
ํจ์ํธ์ถ
ํจ์๋ฅผ ํธ์ถํ์ ๋ this๋ ๋ฌด์์ ๊ฐ๋ฅดํค๋์ง ์ดํด๋ณด์. this๋ ์ ์ญ๊ฐ์ฒด์ธ window์ ๊ฐ๋ค.
์ฆ, ํจ์๊ฐ ํธ์ถ๋ ๋ ๊ฐ์ฒด๊ฐ ๋ฌด์์ด๋!๋ฅผ ์ดํดํ๋ฉด ๋๋ค.
์ ์ญ๊ฐ์ฒด window๋ ์๋ต๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ค window.func()๋ผ๊ณ ํ๋ค๋ฉด func()์ ๊ฐ์ฒด๋ window์ด๋ค.
<script>
function func(){
if(window === this){
document.write("window === this");
}
}
func();
</script>
๊ทธ๋์ ์ ์ฝ๋์ ๊ฒฐ๊ณผ๋ "window === this" ์ด๋ค!
๋ฉ์๋์ ํธ์ถ
๊ฐ์ฒด์ ์์์ธ ๋ฉ์๋์ this๋ ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํจ๋ค.
<!DOCTYPE html>
<html>
<head>
<title>์์ฑ์</title>
</head>
<body>
<script type="text/javascript">
var o = {//๊ฐ์ฒด o์์ฑ.
func : function(){//์์ฑ์ผ๋ก ํจ์๋ฅผ ์ฃผ์์ผ๋, ๋ฉ์๋์.
if(o === this){//์ด ํจ์์ ๊ฐ์ฒด๋ o์. --> this = o
document.write("o === this");
}
}
}
o.func();
</script>
</body>
</html>
๊ฒฐ๊ณผ๋
์ด๋ฒ์ ์์ฑ์์์ this์ ์๋ฏธ๋ฅผ ์์๋ณด๋๋ก ํ์.
์์ฑ์์ ํธ์ถ
์๋ ์ฝ๋๋ ํจ์๋ฅผ ํธ์ถํ์ ๋์ new๋ฅผ ์ด์ฉํด์ ์์ฑ์๋ฅผ ํธ์ถํ์ ๋์ ์ฐจ์ด๋ฅผ ๋ณด์ฌ์ค๋ค.
<!DOCTYPE html>
<html>
<head>
<title>์์ฑ์</title>
</head>
<body>
<script type="text/javascript">
var funcThis = null;
function Func(){//Func๋ผ๋ ํจ์ ์์ฑ
funcThis = this; //์ดํจ์์ this๋ window์. ์ด๊ฒ์ funcThis์ ๋ฃ์.
}
var o1 = Func();//์๋ ๊ทธ๋ฅ ์ ํจ์ ํธ์ถ ํ๋ ๊ฒ์.
if(funcThis === window){
document.write('window <br />');
}
var o2 = new Func(); //์์ฑ์ ๊ฐ์ฒด ์์ฑ
if(funcThis === o2){ //์๋ก ์์ฑ๋๋ ๊ฐ์ฒด๊ฐ ์์ฑ์ ์์์ this๊ฐ ๋จ.
document.write('o2 <br />');
}
</script>
</body>
</html>
๊ฒฐ๊ณผ
์์ฑ์๋ ๋น ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๊ฐ์ฒด๋ด์์ this๋ ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํจ๋ค. ์ด๊ฒ์ ๋งค์ฐ ์ค์ํ ์ฌ์ค์ด๋ค.
์์ฑ์๊ฐ ์คํ๋๊ธฐ ์ ๊น์ง๋ ๊ฐ์ฒด๋ ๋ณ์์๋ ํ ๋น๋ ์ ์๊ธฐ ๋๋ฌธ์ this๊ฐ ์๋๋ฉด ๊ฐ์ฒด์ ๋ํ ์ด๋ ํ ์์ ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ฝ ์ ์ฝ๋์์ Func() ๊ฐ ์ ์๋ ๊ณณ์ if(o2==this) ๋ผ๋ ์กฐ๊ฑด๋ฌธ์ ๋ฃ๋๋ค๋ฉด ๊ฒฐ๊ณผ๋ ์ด๋ป๊ฒ ๋ ๊น? ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
์ด์ ๋ ์์ฑ์๋ฅผ ํธ์ถํ๊ฒ ๋๋ฉด, ํธ์ถ์ด ๋๋ ํ ๊ฐ์ฒด๊ฐ ํ ๋น๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ์ ์๋ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ ธ ์์ง๋ง o2๋ผ๋ ๋ณ์์ ๊ฐ์ฒด๊ฐ ๋ด๊ฒจ ์๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ defined๊ฐ ๋๋ ๊ฒ์ด๋ค.
<script>
function Func(){
document.write(o);
}
var o = new Func();
</script>
๊ฒฐ๊ณผ๋ : undefined
๊ฒฐ๋ก ์ ์ผ๋ก ์์ฑ์ ์์์ this๋ ๊ทธ ์์ฑ์๊ฐ ๋ง๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํจ๋ค๋ ๊ฒ์ด๋ค.
ํจ์๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์.
<script>
function sum(x,y){return x+y;}
document.write(sum(1,2));
//์ ๋ฐฉ๋ฒ์ ์ผ๋ฐ์ ์ธ ํจ์๋ฅผ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ด๋ค.
// ์ ๋ฐฉ๋ฒ์ ํจ์ sum()์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ค๋ค๊ณ ํ๊ณ ์ด๋ฅผ "ํจ์ ๋ฆฌํฐ๋ด"์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
var sum2 = new Function('x','y', 'return x+y;');
document.wirte(sum2(1,2));
//์ ๋ฐฉ๋ฒ์ ์์ฑ์๋ฅผ ํตํด ํจ์๋ฅผ ๊ฐ์ฒด๋ก ๋ง๋ค์ด ์ฃผ๋ ๊ฒ์ด๋ค.
</script>
์ ๋ฐฉ๋ฒ ์ธ์๋
var p = {} ..์ด๋ฐ์์ ๊ฐ์ฒด ์์ฑ ๋ฐฉ๋ฒ์ ๊ฐ์ฒด ๋ฆฌํฐ๋ด ์ด๋ผ๊ณ ํ๋ฉฐ (new Object ๋ก๋ ํ ์ ์๋ค.)
var a = [1,2,3]; ์ด๋ฌํ ๋ฐฉ๋ฒ์ ๋ฐฐ์ด ๋ฆฌํฐ๋ด ์ด๋ผ๊ณ ํ๋ค. (new Array(1,2,3) ์ด๋ผ๊ณ ๋ ํ ์ ์์)
๋ช ์์ ์ผ๋ก ๋ง๋ค ์๋ ์์ง๋ง, ์ด๊ฒ๋ณด๋ค ํธ๋ฆฌํ๊ฒ ๊ฐ์ ๋ง๋ค ์ ์๊ฒ ํด์ฃผ๋ ๋ฌธ๋ฒ์ ์ฒด๊ณ๋ฅผ "๋ฆฌํฐ๋ด"์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ฆ ์ ์ค๋ช ์ ์ํ๋ฉด ๊ฒฐ๊ตญ ํจ์ ๋ฆฌํฐ๋ด๋ก ์์ฑ๋ ํจ์ sum ์ ๊ฐ์ฒด์ด๊ณ , ์ด ๊ฐ์ฒด์์ ์ฌ์ฉํ ์ ์๋ ์์ฑ ๊ฐ(๋ฉ์๋๋ ์์ฑ ๋ฑ) ์ด ์๋์ ๋ฐฐ์ธ apply์ call์ธ ๊ฒ์ด๋ค.
apply, call
ํจ์์ ๋ฉ์๋์ธ apply, call์ ์ด์ฉํ๋ฉด this์ ๊ฐ์ ์ ์ดํ ์ ์๋ค.
์๋ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
<script>
var o = {}
var p = {}
function func(){
switch(this){
case o:
document.write('o<br />');
break;
case p:
document.write('p<br />');
break;
case window:
document.write('window<br />');
break;
}
}
func();//๊ฒฐ๊ณผ window
func.apply(o); //๊ฒฐ๊ณผ o
func.apply(p);//๊ฒฐ๊ณผ p
</script>
func๋ผ๋ ํจ์๋ ๊ฐ์ฒด์ด๊ณ , ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ์ ์๋ค. ์ฆ ํ์ค ๋ฉ์๋์ธ apply๋ฅผ ๊ฐ์ง๊ณ ์์ด์ ํธ์ถ ํ ์ ์๋ค.
์ฒซ๋ฒ์งธ ์ธ์๋ก ํจ์ ํธ์ถ ์ปจํ ์คํธ๋ฅผ ์ค ์ ์์ผ๋ฉฐ, ์ด ๊ฐ์ o๋ก ์ฃผ๋ฉด this๊ฐ o๊ฐ ๋๋ค.
์ฝ๊ฒ ์๊ฐํ์๋ฉด, func = ๊ฐ์ฒด์ด๊ณ ์๋ฌด๊ฒ๋ ์คํ์ํค์ง ์์ผ๋ฉด ์ ์ญ ๊ฐ์ฒด์ธ window๋ฅผ ํฌํจํ๋ค.
๋ง์ฝ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํฌํจํ๊ฒ ๋๋ค๋ฉด o.func์ ๋๋์ผ๋ก ํด์ ํ๋ฉด๋๋ค.
์ด๋ป๊ฒ ํธ์ถํ๋๋์ ๋ฐ๋ผ ๋งฅ๋ฝ์ ์ผ๋ก ์ด๋ ํ ๊ฐ์ฒด์ ์ข ์๋๋ ์กด์ฌ์ด๊ธฐ๋ ํ๋ค๋ ๊ฒ์ด๋ค.
'Languages > Java Script' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Js] prototype | ์์ | javascript ์์ (0) | 2021.02.04 |
---|---|
[Js] ์์ | javascript์์ | prototype (0) | 2021.02.04 |
[Js] ์ ์ญ ๊ฐ์ฒด | ์ ์ญ๊ฐ์ฒด API (0) | 2021.02.04 |
[Js] ์์ฑ์์ new | javascript์ ๊ฐ์ฒด ์งํฅ ํน์ง | ๊ฐ์ฒด (0) | 2021.02.04 |
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค