❓

7. this

Index

Β 

7. this

7.1 this λž€?

  • μžμ‹ μ„ ν˜ΈμΆœν•œ 객체
  • μžμ‹ μ΄ 생성할 객체
thisλŠ” 이 두 κ²½μš°μ—μ„œ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” 자기 μ°Έμ‘° λ³€μˆ˜μž…λ‹ˆλ‹€. μ•„λž˜ μ˜ˆμ œμ—μ„œ thisλŠ” windowμž…λ‹ˆλ‹€.
function a(){ console.log(this) } a();
let myObj = { val1: 100, func1: function () { console.log(this); } } myObj.func1();
예λ₯Ό 듀어보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€. λͺ¨λ“  ν•¨μˆ˜λŠ” μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ this λΌλŠ” 객체가 μΆ”κ°€λ©λ‹ˆλ‹€. thisλŠ” ν•¨μˆ˜κ°€ 싀행될 λ•Œ ν•¨μˆ˜λ₯Ό μ†Œμœ ν•˜κ³  μžˆλŠ” 객체λ₯Ό μ°Έμ‘°ν•©λ‹ˆλ‹€.
/ * this */ function sayName(){ console.log(this.name); } var name = 'Hero'; // μ „μ—­μœΌλ‘œ μ„ μ–Έν•œ name λ³€μˆ˜μ˜ μ•žμ—λŠ” window κ°€ μƒλž΅λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. // λ•Œλ¬Έμ— window.name === "Hero" κ°€ μ„±λ¦½ν•©λ‹ˆλ‹€. let peter = { name : 'Peter Parker', sayName : sayName } let bruce = { name : 'Bruce Wayne', sayName : sayName } sayName(); peter.sayName(); bruce.sayName(); /* sayName() ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œμ™€ peter, bruce 객체의 sayName ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν–ˆμ„ λ•Œμ˜ κ²°κ³Όλ₯Ό 비ꡐ해 λ³΄μ„Έμš” */
/* this μ‚¬μš© μ˜ˆμ‹œ */ let ν˜Έν…” = [{ '이름' : 'ν•˜λ‚˜ν˜Έν…”', 'μœ„μΉ˜' : 'μ œμ£Όλ„ μ œμ£Όμ‹œ 001', '가격' : {'A':50000, 'B':30000, 'C':15000}, '방의개수' : 50, 'μ˜ˆμ•½μžμˆ˜' : 25, 'λ‚¨μ€λ°©μ˜κ°œμˆ˜' : function(){return this.방의개수 - this.μ˜ˆμ•½μžμˆ˜} },{ '이름' : 'λ‘˜ν˜Έν…”', 'μœ„μΉ˜' : 'μ œμ£Όλ„ μ œμ£Όμ‹œ 002', '가격' : {'A':100000, 'B':60000, 'C':30000}, '방의개수' : 100, 'μ˜ˆμ•½μžμˆ˜' : 30, 'λ‚¨μ€λ°©μ˜κ°œμˆ˜' : function(){return this.방의개수 - this.μ˜ˆμ•½μžμˆ˜} },{ '이름' : 'μ…‹ν˜Έν…”', 'μœ„μΉ˜' : 'μ œμ£Όλ„ μ œμ£Όμ‹œ 003', '가격' : {'A':80000, 'B':50000, 'C':30000}, '방의개수' : 120, 'μ˜ˆμ•½μžμˆ˜' : 80, 'λ‚¨μ€λ°©μ˜κ°œμˆ˜' : function(){return this.방의개수 - this.μ˜ˆμ•½μžμˆ˜} }]; console.log(ν˜Έν…”[0].λ‚¨μ€λ°©μ˜κ°œμˆ˜()); console.log(ν˜Έν…”[1].λ‚¨μ€λ°©μ˜κ°œμˆ˜()); console.log(ν˜Έν…”[2].λ‚¨μ€λ°©μ˜κ°œμˆ˜());
Β 
Β 

7.2 this 의 νŠΉμ§•

thisλŠ” ν•¨μˆ˜κ°€ λ§Œλ“€μ–΄μ§ˆ λ•Œκ°€ μ•„λ‹Œ 'μ‹€ν–‰'될 λ•Œ κ·Έ 값이 κ²°μ •λ©λ‹ˆλ‹€.
function sayName(){ console.log(this.name); } var name = 'Hero'; let peter = { name : 'Peter Parker', sayName : sayName }; let bruce = { name : 'Bruce Wayne', sayName : peter.sayName }; bruce.sayName();
Β 

7.3 this 값을 μ‚¬μš©μžμ˜ μ˜λ„λŒ€λ‘œ μ‘°μž‘ν•˜κΈ°

ν•¨μˆ˜μ˜ apply(), call(), bind() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ thisλ₯Ό μ‘°μž‘ν•˜κ±°λ‚˜ κ³ μ •ν•΄ λ‘˜ 수 μžˆμŠ΅λ‹ˆλ‹€.
μ΄λŠ” μ‚¬μš©μžκ°€ μ›ν•˜λŠ” μ˜λ„λŒ€λ‘œ binding을 ν†΅ν•œ μ»¨νŠΈλ‘€μ„ ν•  수 있게 ν•©λ‹ˆλ‹€.
Β 
7.3.1 call()
call() λ©”μ„œλ“œμ˜ μΈμˆ˜μ— this 둜 μ‚¬μš©ν•  값을 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.
var peter = { name : 'Peter Parker', sayName : function(){ console.log(this.name); } } var bruce = { name : 'Bruce Wayne', } peter.sayName.call(bruce); // peter.sayName.call(bruce) 의 κ²°κ³ΌλŠ” 무엇이 될지 생각해 λ΄…μ‹œλ‹€.
Β 
7.3.2 apply()
apply() λ©”μ„œλ“œμ˜ μΈμˆ˜μ— this 둜 μ‚¬μš©ν•  값을 전달할 수 있으며, λ°°μ—΄μ˜ ν˜•νƒœλ‘œλ„ 전달할 수 μžˆμŠ΅λ‹ˆλ‹€.
var peter = { name : 'Peter Parker', sayName : function(is, is2){ console.log(this.name+ ' is '+ is + ' or ' + is2); } } var bruce = { name : 'Bruce Wayne', } peter.sayName.apply(bruce, ['batman', 'richman']); /* peter.sayName.apply(bruce, ['batman', 'richman']) 의 κ²°κ³Όκ°€ 무엇이 될지 생각해보고 apply λ₯Ό call둜 λ°”κΎΈμ–΄ ν˜ΈμΆœν–ˆμ„ λ•Œμ™€ 비ꡐ해 λ΄…μ‹œλ‹€. */
Β 
7.3.3 bind()
bind() λŠ” thisκ°€ κ³ μ •λœ μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
function sayName(){ console.log(this.name); } var bruce = { name: 'bruce', sayName : sayName } var peter = { name : 'peter', sayName : sayName.bind(bruce) } peter.sayName(); bruce.sayName(); /* peter.sayName() κ³Ό bruce.sayName() 의 κ²°κ³Ό 값이 무엇이 될지 μƒκ°ν•΄λ΄…μ‹œλ‹€. */
Β 

Β 
λ‹€μŒκ³Ό 같이 콜백의 thisκ°€ 전역을 바라보고 μžˆμ§€ μ•Šμ€ κ²½μš°λ„ μžˆμŠ΅λ‹ˆλ‹€.
[1, 2, 3].forEach(function(){console.log(this)}, [10, 20, 30])