this์ ๋ํด ์ฐพ์๋ณด๋ฉด ์๊ฒฉ๋ชจ๋์ ๋ํด ๋ง์ด ๋ณผ ์ ์์ต๋๋ค.
์๊ฒฉ๋ชจ๋๋ ๋ฌด์์ผ๊น?
์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ฝค ์ค๋ซ๋์ ํธํ์ฑ ์ด์ ์์ด ๋ฐ์ ํด์์ต๋๋ค.
๊ธฐ์กด์ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ์๋ก์ด ๊ธฐ๋ฅ์ด ๋์์ต๋๋ค.
๋๋ถ์ ๊ธฐ์กด์ ์์ฑํ ์ฝ๋๋ ์ ๋ ๋ง๊ฐ์ง์ง ์๋๋ค๋ ์ฅ์ ์ด ์์์ต๋๋ค.
ํ์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ ์ฐฝ์์๋ค์ด ํ๋ ์ค์๋ ๋ถ์์ ํ ๊ฒฐ์ ์ด ์ธ์ด ์์ ์์ํ ๋ฐ์ ๋๋ค๋ ๋จ์ ๋ ์๊ฒผ์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์๋กญ๊ฒ ์ ์ ๋ ES5์์๋ ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๊ณ ๊ธฐ์กด ๊ธฐ๋ฅ ์ค ์ผ๋ถ๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค. ๊ธฐ์กด ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ์๊ธฐ ๋๋ฌธ์ ํ์ ํธํ์ฑ ๋ฌธ์ ๊ฐ ์๊ฒจ ๋ณ๊ฒฝ์ฌํญ ๋๋ถ๋ถ์ ES5์ ๊ธฐ๋ณธ ๋ชจ๋์์ ํ์ฑํ๋์ง ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
๋์ use strict๋ผ๋ ํน๋ณํ ์ง์์๋ฅผ ์ฌ์ฉํด ์๊ฒฉ ๋ชจ๋(strict mode)๋ฅผ ํ์ฑํ ํ์ ๋๋ง ์ด ๋ณ๊ฒฝ์ฌํญ์ด ํ์ฑํ๋๊ฒ ํด๋์์ต๋๋ค.
์๊ฒฉ๋ชจ๋
1. ๊ธฐ์กด์๋ ์กฐ์ฉํ ๋ฌด์๋๋ ์๋ฌ๋ค์ throwingํฉ๋๋ค.
2.JavaScript ์์ง์ ์ต์ ํ ์์
์ ์ด๋ ต๊ฒ ๋ง๋๋ ์ค์๋ค์ ๋ฐ๋ก์ก์ต๋๋ค.
๊ฐ๋์ฉ ์๊ฒฉ ๋ชจ๋์ ์ฝ๋๊ฐ ๋น-์๊ฒฉ๋ชจ๋์ ๋์ด๋ใด ์ฝ๋๋ณด๋ค ๋ ๋นจ๋ฆฌ ์๋ํ๋๋ก ๋ง๋ค์ด์ง๋๋ค.
3. ECMAScript์ ์ฐจ๊ธฐ ๋ฒ์ ๋ค์์ ์ ์ ๋ ๋ฌธ๋ฒ์ ๊ธ์งํฉ๋๋ค.
์ฌ์ฉ๋ฐฉ๋ฒ
"use strict";(๋๋ 'use strict';) ์ ๋ค๋ฅธ ๊ตฌ๋ฌธ ์์ฑ ์ ์ ์ฝ์
ํฉ๋๋ค.
// ์ ์ฒด ์คํฌ๋ฆฝํธ ์๊ฒฉ ๋ชจ๋ ๊ตฌ๋ฌธ
'use strict';
var v = "Hi! I'm a strict mode script!";
// ํจ์์์ strict mode ์ ์ฉ
function strict(){
// ํจ์-๋ ๋ฒจ strict mode ๋ฌธ๋ฒ
'use strict';
function nested() { return "And so am I!"; }
return "Hi! I'm a strict mode function! " + nested();
}
function notStrict() { return "I'm not strict."; }
// module์์ strict mode ์ ์ฉ
function strict() {
// ๋ชจ๋์ด๊ธฐ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๊ฒฉํฉ๋๋ค
}
export default strict;
๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋์ด ์๋ ์์ฑ
this์ ๊ฐ์ ํจ์๋ฅผ ํธ์ถํ ๋ฐฉ๋ฒ์ ์ํด ๊ฒฐ์ ๋ฉ๋๋ค.
ES5๋ ํจ์๋ฅผ ์ด๋ป๊ฒ ํธ์ถํ๋์ง ์๊ดํ์ง ์๊ณ this๊ฐ์ ์ค์ ํ ์ ์๋ bind๋ฉ์๋๋ฅผ ๋์
ํ๊ณ , ํ์ ์ค์ค๋ก์ this๋ฐ์ธ๋ฉ์ ์ ๊ณตํ์ง์๋ ํ์ดํ ํจ์๋ฅผ ์ถ๊ฐ ํ์ต๋๋ค.
-์ผ๋ฐ ํจ์์์ this๋ window ๊ฐ์ฒด
-event Listener์์๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ ๊ฐ์ฒด
-๋ฉ์๋์์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ฐ์ฒด
์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๊ฒฐ์ ๋๋ค.
1. ํจ์์์์ this
2. ๋ฉ์๋์์์ this
3. ์์ฑ์์์์ this
4. ๊ฐ์ฒด์์์ this
5. ๊ฐ์ ์คํ์์์ this
6. ๋ฐ์ธ๋ฉ ํจ์์์์ this
7. ํ์ดํ ํจ์์์์ this
๋ธ๋ผ์ฐ์ ์์ this์ ์ ์ญ๊ฐ์ฒด๋ window์ด๋ค.
๋ฉ์๋์์์ this๋ ๋ฉ์๋ ์คํ๋ ๋ฉ์๋๋ฅผ ์์ ํ๊ณ ์๋ ๊ฐ์ฒด.
์์ฑ์๋ new ํค์๋๋ฅผ ๋ถ์ฌ์ผํ๋ค. new๋ฅผ ๋ถ์ด์ง ์์ ์ ์๋ฌ ๋ฐ์!
ES6๋ถํฐ๋ class๋ฅผ ์ฌ์ฉ ํ ์ ์๋ค.
์์ฑ์์์ this
function person(_name, _age) {
this.name = _name;
this.age = _age;
}
/* Peson๊ฐ์ฒด ๋ฉ์๋ ์ถ๊ฐ */
person.prototype.changeName = function(newName) {
this.name = newName;
}
// 1
const p = new person('Youngjin', '22');
console.log(p.name); // Youngjin ์ด ์ถ๋ ฅ
// 2
p.changeName('Requiem');
console.log(p.name); // Requiem ์ด ์ถ๋ ฅ
1์์ ๊ฐ๋ฆฌํค๋ this๋ ์๋ก ๋ง๋ค์ด์ง person์ ๊ฐ๋ฆฌํค๊ณ p๊ฐ ๋ง๋ค์ด์ง ๋ Youngjin๊ณผ 22๊ฐ ๋ค์ด์ p.name์ p๊ฐ ๋ง๋ค์ด ์ง ๋ ์ด๋ฆ Youngjin์ด ๋จ.
changeName๋ฉ์๋์์ this๊ฐ ๊ฐ๋ฆฌํค๋๊ฒ ๋ง๋ค์ด์ง person์ด๋ผ p.changeName('Requiem')์ ํ๊ฒ๋๋ฉด ๋ง๋ค์ด์ง p์ ์ด๋ฆ์ด Youngjin -> Requiem์ผ๋ก ๋ณ๊ฒฝ๋จ.
class์์ฑ์์์์ this
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
changeName(newName) {
this.name = newName;
}
}
const p = new Person('Youngjin', '22');
console.log(p.name); // Youngjin ์ด ์ถ๋ ฅ
p.changeName('Requiem');
console.log(p.name); // Requiem ์ด ์ถ๋ ฅ
๊ฐ์ฒด์์์ this๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด.
๊ฐ์ ์คํ์ด๋ call(), apply()๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
call()๋ฉ์๋๋ ์ฃผ์ด์ง this๊ฐ ๋ฐ ๊ฐ๊ฐ ์ ๋ฌ๋ ์ธ์์ ํจ๊ป ํจ์๋ฅผ ํธ์ถํจ.
apply()๋ฉ์๋๋ ์ฃผ์ด์ง this๊ฐ๊ณผ ๋ฐฐ์ด(๋๋ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด)๋ก ์ ๊ณต๋๋ arguments๋ก ํจ์๋ฅผ ํธ์ถํจ.
๋๋ค ์ ์ฌํ์ง๋ง call()์ ์ธ์ ๋ชฉ๋ก, apply()๋ ์ธ์ ๋ฐฐ์ด์ ๋ฐ๋ ๊ฒ์ด ์ฐจ์ด.
๊ฐ์ ์คํ์์ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก this
bind()๋ฉ์๋์ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ bind()๋ ์๋ก์ด ํจ์๋ฅผ ๋ง๋๋ ์ญํ ์ ํจ.
strict mode์ผ๋ ์๋ ๋ ์ฐจ์ด๋ฅผ ๋ณด์.
const module = {
x: 42,
getX: function() {
return this.x;
}
};
const unboundGetX = module.getX;
console.log(unboundGetX()); // The function gets invoked at the global scope
// expected output: undefined
const boundGetX = unboundGetX.bind(module);
console.log(boundGetX());
// expected output: 42
unboundGetX๋ ์ ์ญ์์ ํธ์ถ์ด ๋์๊ณ , boundGetX๋ module์ getX๋ฅผ ํธ์ถํจ.
ํ์ดํ ํจ์๋ ๊ฐ๋จํ ํํ๋ก ์ ์ํ๊ฑฐ๋ ํน์ ๋ฌธ๋งฅ์ ๋ฐ์ธ๋ ํ๊ธฐ ์ํด ์ฃผ๋ก ์ฌ์ฉ๋จ.
let person = {
name: "youngjin",
getName: function () {
console.log(this) // person ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค
setTimeout(() => {
console.log(this) // person๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค
console.log(this.name); // youngjin ์ ์ถ๋ ฅํ๋ค.
}, 1000);
}
}
person.getName();
์๋ฐ์คํฌ๋ฆฝํธ ๋ด๋ถํจ์๋ ์ผ๋ฐํจ์, ๋ฉ์๋, ์ฝ๋ฐฑํจ์ ์ด๋์ ์ ์ธ๋์๋ ์ง this๊ฐ ์ ์ญ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด.
์ผ๋ฐํจ์์ this๋ window(์ ์ญ)์ ๊ฐ๋ฅดํค๋ฉฐ, ํ์ดํ ํจ์์ this๋ ์ธ์ ๋ ์์ ์ค์ฝํ์ this๋ฅผ ๊ฐ๋ฆฌํด.
3๊ฐ์ง ๋ฐฉ๋ฒ์ this๋ฅผ ๋ฐ์ธ๋ฉ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ.
์ผ๋ฐ ํจ์์์ this๋ undefined๊ฐ ๋ฐ์ธ๋ฉ๋จ.
์ดํด๊ฐ ํ๋ฒ์ ์ ์๋๋ ์์ฃผ ์ฐพ์๋ด์ผ๊ฒ ๋ค.
https://ko.javascript.info/strict-mode
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Strict_mode
https://kkan0615.github.io/youngjin.github.io/javascript_this/#
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function/call
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
https://sunnykim91.tistory.com/121