const circle = {
radius: 5,
getDiameter() {
return 2 * circle.radius; // 재귀
},
};
console.log(circle.getDiameter());
// 일반함수 호출
const foo = function () {
console.log(this);
};
foo();
/* <ref *1> Object [global] {
global: [Circular *1],
clearInterval: [Function: clearInterval],
clearTimeout: [Function: clearTimeout],
setInterval: [Function: setInterval],
setTimeout: [Function: setTimeout] {
[Symbol(nodejs.util.promisify.custom)]: [Getter]
},
queueMicrotask: [Function: queueMicrotask],
clearImmediate: [Function: clearImmediate],
setImmediate: [Function: setImmediate] {
[Symbol(nodejs.util.promisify.custom)]: [Getter]
}
일반함수는 global 객체를 가리킨다.
} */
// 메서드 호출
const obj = { foo };
obj.foo(); // { foo: [Function: foo] }
// 생성자 함수 호출
new foo(); //foo {}
function foo() {
console.log("foo's this:", this);// global
function bar() {
console.log("bar's this:", this); // global
}
bar();
}
foo();
var value = 1;
const obj = {
value: 100,
foo() {
console.log("foo's this:", this); // obj
setTimeout(function () {
console.log("callback's this:", this); // window
console.log("callback's value:", this.value); // 1
}, 100);
},
};
obj.foo();
this를 변수에 할당
var value = 1;
const obj = {
value: 100,
foo() {
const that = this;
setTimeout(function () {
console.log("callback's that:", that); //{ value: 100, foo: [Function: foo] }
console.log("callback's value:", that.value); //100
}, 100);
},
};
obj.foo();
bind 사용
var value = 1;
const obj = {
value: 100,
foo() {
setTimeout(
function () {
console.log("callback's that:", this); //{ value: 100, foo: [Function: foo] }
console.log("callback's value:", this.value); //100
}.bind(this),
100
);
},
};
obj.foo();
화살표함수 사용( 화살표 함수 내부의 this는 상위 스코프의 this를 가리킨다.)
var value = 1;
const obj = {
value: 100,
foo() {
setTimeout(() => console.log(this.value), 100); // 100
},
};
obj.foo();
const person = {
name: "Yim",
getName() {
return this.name;
},
};
console.log(person.getName());
// getName을 호출한 객체는 person 이다.
const anotherPerson = {
name: "Kim",
};
anotherPerson.getName = person.getName; // 메서드 할당
console.log(anotherPerson.getName());
const getName = person.getName;
console.log(getName()); // window.name
function getThisBinding() {
console.log(arguments);
return this;
}
const thisArg = { a: 1 };
console.log(getThisBinding);
console.log(getThisBinding.apply(thisArg, [1, 2, 3]));
// [Arguments] { '0': 1, '1': 2, '2': 3 }
// { a: 1 }
console.log(getThisBinding.call(thisArg, 1, "zz", 3));
// [Arguments] { '0': 1, '1': 'zz', '2': 3 }
// { a: 1 }
console.log(getThisBinding.bind(thisArg));
//[Function: bound getThisBinding] 호출이 안된다.
console.log(getThisBinding.bind(thisArg)());
// /[Arguments] {}
// { a: 1 }