this

μ •μ˜

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ thisλž€ μžμ‹ μ΄ μ†ν•œ 객체 λ˜λŠ” μžμ‹ μ΄ 생성할 μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚€λŠ” 자기 μ°Έμ‘° λ³€μˆ˜μ΄λ‹€. 라고 μ“°μ—¬μžˆλ‹€. 말이 μ’€ μ–΄λ €μš΄λ° κ°„λ‹¨ν•œ μ˜ˆμ‹œλ₯Ό 톡해 μ•Œμ•„λ³΄μž.

let person = {
  firstName: "Kim",
  lastName: "Chungyeon",
  fullName: function() {
    return this.firstName + " " + this.lastName;
  }
};

console.log(person.fullName()); //Kim ChungYeon

이 μ˜ˆμ‹œ μ½”λ“œλŠ” this 의 μ •μ˜ 쀑 "μžμ‹ μ΄ μ†ν•œ 객체λ₯Ό κ°€λ¦¬ν‚€λŠ”~" 에 λŒ€ν•œ μ½”λ“œμ΄λ‹€. μ˜ˆμ‹œμ—μ„œ thisλŠ”person 객체의 fullName λ©”μ„œλ“œμ—μ„œ μ‚¬μš©λ˜μ—ˆλ‹€. thisλŠ” μ‹€ν–‰ 쀑인 ν•¨μˆ˜κ°€ μ†ν•œ 객체λ₯Ό κ°€λ¦¬ν‚€λ―€λ‘œ μ—¬κΈ°μ„œ thisλŠ” λ°”λ‘œ person 객체λ₯Ό 가리킨닀.

function Person(name) {
  this.name = name;
}

Person.prototype.introduce = function() {
  console.log("μ•ˆλ…•ν•˜μ„Έμš”, 제 이름은 " + this.name + "μž…λ‹ˆλ‹€.");
}

// μΈμŠ€ν„΄μŠ€ 생성
let person1 = new Person("Kim");
let person2 = new Person("Lee");

person1.introduce(); // μ•ˆλ…•ν•˜μ„Έμš”, 제 이름은 Kimμž…λ‹ˆλ‹€.
person2.introduce(); // 

μ΄λ²ˆμ—λŠ” "μžμ‹ μ΄ 생성할 μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚€λŠ”~"에 λŒ€ν•œ μ˜ˆμ‹œ μ½”λ“œλ₯Ό 보자.

μ˜ˆμ‹œμ—μ„œ thisλŠ” Person 객체의 ν”„λ‘œν† νƒ€μž…μ— μΆ”κ°€λœ λ©”μ„œλ“œμΈ introduceμ—μ„œ μ‚¬μš©λ˜μ—ˆλ‹€. 즉, μ—¬κΈ°μ„œ λ§ν•˜λŠ” "μžμ‹ "은 ν”„λ‘œν† νƒ€μž…μ„ λ§Œλ“  Person 객체이며, Person 객체가 μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€κ°€ λ°”λ‘œ person1κ³Ό person2 이닀. λ”°λΌμ„œ thisλŠ” Person이 생성할 μΈμŠ€ν„΄μŠ€μΈ person1κ³Ό person2λ₯Ό κ°€λ¦¬ν‚€λŠ” 것이닀.

두 번째 μ˜ˆμ‹œ μ½”λ“œμ—μ„œ μ•Œμ•„λ³Έ κ²ƒμ²˜λŸΌ, thisλŠ” ν˜ΈμΆœν•˜λŠ” λŒ€μƒμ— 따라 λ™μ μœΌλ‘œ κ°€λ¦¬ν‚€λŠ” 값이 κ²°μ •λ˜λ©°, this의 값이 κ²°μ •λ˜λŠ” 것을 바인딩이라고 ν•œλ‹€. 바인딩에 λŒ€ν•΄ 쑰금 더 μ‚΄νŽ΄λ³΄μž

바인딩

일반 ν•¨μˆ˜μ—μ„œ thisλŠ” μ „μ—­ 객체인 window에 기본적으둜 바인딩 λœλ‹€. (node.jsμ—μ„œλŠ” global)

console.log(this) // window

function test() {
  console.log(this); // Window {0: Window, ...}
  function inner() {
    console.log(this); // Window {0: Window, ...}
  }
  inner();
}
test();

λ©”μ„œλ“œ 호좜 μ‹œμ—λŠ” μš°λ¦¬κ°€ μ˜ˆμ‹œ μ½”λ“œ 1 μ—μ„œ 확인 ν–ˆλ˜ κ²ƒμ²˜λŸΌ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ 객체에 바인딩 λœλ‹€.

μœ μ˜ν•  점은, λ§Œμ•½ ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œ μž‘μ„±μ΄ 된 경우, this λŠ” μƒμœ„ μ»¨ν…μŠ€νŠΈμ˜ thisλ₯Ό μ°Έμ‘°ν•˜κΈ° λ•Œλ¬Έμ— μ•„λž˜ μ˜ˆμ‹œμ—μ„œλŠ” μ „μ—­ 객체에 바인딩 λœλ‹€.

μ•„λž˜μ—μ„œ λ‹€μ‹œ ν•œ 번 μ‚΄νŽ΄λ³΄μž.

const obj = {
	normal: function() {
		console.log('normal fn this:', this);
	},
	arrow: () => {
		console.log('arrow fn this:', this);
	},
}

obj.normal(); // normal fn this: obj
obj.arrow(); // arrow fn this: window

λ‹€μŒμœΌλ‘œ μƒμ„±μž ν•¨μˆ˜μ—μ„œλŠ” μƒμ„±μž ν•¨μˆ˜λ‘œ λΆ€ν„° λ§Œλ“€μ–΄μ§€λŠ” μΈμŠ€ν„΄μŠ€μ— 바인딩 λœλ‹€.

function User(name) {
  this.name = name;
}
const user1 = new User('Kim');
console.log(user1.name); // Kim

그런데 λ§Œμ•½ new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ€ 일반 ν•¨μˆ˜λ‘œ ν˜ΈμΆœλ˜λŠ” 경우, μ „μ—­κ°μ²΄λ‘œ 바인딩 λœλ‹€.

μœ„μ—μ„œ μž μ‹œ μ‚΄νŽ΄λ³΄μ•˜λŠ”λ°, ν™”μ‚΄ν‘œν•¨μˆ˜μ—μ„œ μ‚¬μš©λœ this의 경우, Lexical thisλ₯Ό λ°”μΈλ”©ν•œλ‹€. μ‰½κ²Œ 말해, ν™”μ‚΄ν‘œ ν•¨μˆ˜μ˜ λ ‰μ‹œμ»¬ μŠ€μ½”ν”„μ— μ‘΄μž¬ν•˜λŠ” thisλ₯Ό 바인딩 ν•˜κ²Œ λœλ‹€.

const arrow= () => {
	console.log(this);
}

arrow(); // window

// arrow λ©”μ„œλ“œμ˜ μŠ€μ½”ν”„μ— μ •μ˜λ˜μžˆμœΌλ―€λ‘œ, thisκ°€ arrow λ©”μ„œλ“œμ˜ thisλ₯Ό 가리킨닀.
const obj = {
	arrow: function() {
		const arrowInner = () => {
			console.log(this);
		}

		arrowInner ();
	}
};

obj.arrow(); // obj

μ˜ˆμ‹œ μ½”λ“œλ₯Ό 보면 obj 객체의 arrow λ©”μ„œλ“œμ˜ λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λŠ” μƒμ„±λ˜μ—ˆμ„ λ‹Ήμ‹œμ˜ ν™˜κ²½μΈ obj 객체이고, arrowInner λŠ” ν™”μ‚΄ν‘œ ν•¨μˆ˜μ΄λ―€λ‘œ, thisλŠ” arrow λ©”μ„œλ“œμ˜ μŠ€μ½”ν”„μ˜ thisλ₯Ό κ°€λ¦¬ν‚€κ²Œ λœλ‹€. 그런데 arrow λ©”μ„œλ“œμ˜ μŠ€μ½”ν”„μ˜ thisκ°€ λ°”λ‘œ obj κ°μ²΄μ΄λ―€λ‘œ thisλŠ” obj 객체λ₯Ό κ°€λ¦¬ν‚€λŠ” 것이닀.

λ§ˆμ§€λ§‰μœΌλ‘œ 이벀트 μ²˜λ¦¬μ—μ„œ thisλ₯Ό μ‚΄νŽ΄λ³΄μž.

const button = document.getElementById('button');
const consoleThis = function (e) {
  console.log(e.target === this, this);
};

button.addEventListener('click', consoleThis);
// <button id="button">click</button>

이벀트 μ²˜λ¦¬μ—μ„œ thisλŠ” 이벀트λ₯Ό 받은 HTML μš”μ†Œλ₯Ό 가리킨닀. μ˜ˆμ‹œ μ½”λ“œμ—μ„œλŠ” button 에 클릭 이벀트λ₯Ό 쀬기 λ•Œλ¬Έμ—, console.log 에 좜λ ₯ λ˜λŠ” κ°’, thisλŠ” λ°”λ‘œ button μš”μ†Œ μžμ²΄μ΄λ‹€.

Last updated