function printThis() {
console.log(this);
}
printThis();
function printThis() {
console.log(this); // Browser : window / Node : global
}
printThis();
function printThis() {
'use strict';
console.log(this); // undefined
}
printThis();
// 왼 - 함수 안에서 또 다른 함수 선언
const obj = {
foo() {
function boo() {
console.log(this);
}
boo();
},
};
// 오 - 함수 안에서 setTimeOut의 콜백함수 선언하여 사용
const obj = {
foo() {
setTimeout(function () {
console.log(this);
}, 0);
},
};
const me = {
name : 'Halee',
printName() {
// 암시적 바인딩에 의해 me 객체가 됨
const self = this;
setTimeout(function() {
console.log(self.name);
}, 0);
},
};
me.printName(); // Halee
const outer = {
inner : {
printThis() {
console.log(this);
},
},
};
// this는 inner로 바인딩 됨
outer.inner.printThis();
function Someone(name) {
this.name = name;
}
// 내부 this에는 me 가 바인딩
const me = new Someone('Halee');
Function.prototype
의 메서드로 모든 함수가 상속받아 사용할 수 있음Function.prototype.apply(thisArg, argsArray)
: this로 사용할 객체, 함수에게 전달할 인수리스트의 배열 또는 유사객체를 전달받음Function.prototype.call(thisArg, arg1, arg2,...)
: this로 사용할 객체, 함수에게 전달할 인수 리스트를 하나하나 받음Function.prototype.bind(thisArg, arg1, arg2, ...)
: this로 사용할 객체, 함수에게 전달할 인수 리스트를 하나하나 받음const someone = {
name : 'Halee',
printName() {
console.log(this.name);
},
};
// 1. printName을 someone의 메서드로 호출하면서 암시적 바인딩
// 2. bind 메서드를 사용해 this의 name을 Zzanggu로 명시적 바인딩
// 이 경우 명시적 바인딩이 된 객체 값인 짱구가 출력됨
someone.printName.bind( { name: 'Zzanggu' } )();
function setName(name) {
this.name = name;
}
let someone = {
name: 'Halee',
};
// 1. 명시적 바인딩 호출
const setNameBindSomeone = setName.bind(someone);
// 2. new 바인딩 호출
someone = new setNameBindSomeone('Zzanggu');
// 3. 짱구 출력
console.log(someone.name);
const arrowFn = () => {
console.log('나는야 화살표 함수');
}
const someone = {
name : 'Halee',
printName : () => {
console.log(this.name);
},
};
// 암시적 바인딩에 의해 this 가 someone일 것 같음 -> 실제로는 전역객체 바인딩
// scope chain에 의해 나온 가장 가까운 객체가 전역 객체
// 하지만 실제 결과는 브라우저 에서는 빈 문자열 / 노드에서는 undefined 출력
// window 객체의 name값이 기본값으로 빈 문자열로 설정
someone.printName();
const someone = {
name : 'Halee',
printName() {
console.log(this.name);
},
};
// 암시적 바인딩에 의해 this 가 someone으로 동작
someone.printName();
class SomeClass {
}
new > 명시적 > 암시적 > 기본