키워드
obj.name() 형태로 호출한 함수(메소드)에서 this로 인스턴스(오브젝트)를 참조
실행 콘텍스트의 this 바인딩 컴포넌트에 바인딩
글로벌 오브젝트에서 this는 글로벌 오브젝트 참조
this와 window 오브젝트
Hosw 오브젝트 개념 적용
글로벌 오브젝트에 코드 작성
window.onload = function(){
// 안이 아니라 밖에 코드 작성
};
this가 window 참조
log(this === window);
// true
var value = 100;
log(this.value);
// 100
var value = 100;
log(window.value);
// 100
this.value = 100;
log(window.value);
// 100
window.onload = function(){
// 여기에 코드 작성
}
this가 window 참조
window.onload = function(){
log(this === window);
};
// true
window.onload = function(){
var value = 100;
log(this.value);
};
// undefined
window.onload = funciton(){
this.value = 100;
log(window.value);
};
// 100
오브젝트.함수이름() 형태로 함수 호출
strict 모드에서는
함수 앞에 오브젝트를 작성하지 않으면
function book(){
"use strict";
return this;
};
var result = book();
log(result);
// undefined
function book(){
"use strict";
return this;
};
var obj = window.book();
log(obj === window);
// true
var book = {
point: 100,
memeber: {
point: 200,
get: function(){
log(this === book.memeber);
log(this.poin);
}
}
};
book.memeber.get();
// true
// 200
this가 참조하는 오브젝트
마지막 줄에서 book.memeber.get() 호출
console.log(this === book.memeber);
console.log(this.point);
정리 시간
var book = {
value: 123,
get: function() {
var value = 456;
log(this === window);
log(this.value);
}
};
var fn = book.get;
fn();
// true
// undefined
마지막 줄에서 fn()을 호출하면 book.get() 함수가 호출됨
console.log(this === window)에서 true가 출력되는 논리를 제시하시오.
console.log(this.value)에서 undefined가 출력되는 논리를 제시하시오.
인스턴스 목적?
인스턴스에서 this의 목적?
__proto__
프로퍼티 접근
__proto__
에 첨부되며__proto__
에 첨부된 method() 호출var book = {};
book.Point = function(point){
this.point = point;
};
book.Point.prototype.getPoint = function(){
log(this.point);
};
var obj = new book.Point(100);
obj.getPoint();
// 100
var obj = new book.Point(100);
this.point = point;
obj.getPoint();
console.log(this.point);
getTotal.call(this, 10, 20)
첫 번째 파라미터에
"use strict";
var value = 100;
function get(param){
return param + this.value;
};
var result = get.call(this, 20);
log(result);
// 120
get.call(this, 20)
return param + this.value;
call(()을 사용하지 않고
return param + this.value;
var get = function(value){
return this.base + this.rate + value;
};
var value = {base: 20, rate: 30};
var result = get.call(value, 50);
log(result);
// 650
var result = get.call(value, 50);
return this.base * this.rate + value;
this로 참조할 오브젝트를 변경할 수 있는 것이 call()의 특징
function get(){
return this.valueOf();
};
var result = get.call(123);
log(result);
// 123
var result = get.call(123);
값(123) 타입에 해당하는
var book = {
value: 123,
point: {
value: 456,
get: function () {
log(this.value);
}
}
};
book.point.get.call(book);
book.point.get.call(book.point);
// 123
// 456
book.point.get.call(book);
book.point.get.call(book.point);
var obj = {0: 10, 1: 20, 2: 30};
var data = [4, 5, 6];
function get(){
for (k = 0; k < arguments.length; k++){
log(arguments[k] + this[k]);
};
};
get.apply(obj.data);
// 14
// 25
// 36
get.apply(obj, data);
두 번째 파라미터 [4, 5, 6]을
get()으 함수 코드는 바뀌지 않으며
Array-like 형태
var obj = {value: 100};
var data = [5, 6, 7];
function callback(element, index, data){
return element + this.value;
};
function get(data){
return data.map(callback, obj);
};
var result = get(data);
log(result);
// [105, 106, 107]
ES5의 map(), forEach()처럼
function callback(element, index, data){
return element + this.value;
};
return data.map(callback, obj);
map()의 코드는 바꾸지 않고
두 번에 나누어 처리
파라미터
생성한 function을 호출할 때에도 파라미터 작성 가능
var book = {
point: 123,
get: function() {
return this.point;
}
};
var obj = book.get.bind(book);
log(typeof obj);
var result = obj();
log(result);
// function
// 123
var obj = book.get.bind(book);
console.log(typeof obj);
bind()의 첫 번째 파라미터
var result = obj();
return this.point;
var book = {
get: function(){
return Array.prototype.slice.call(arguments);
}
};
var obj = book.get.bind(this, 10, 20);
var result = obj(30, 40);
log(result);
// [10, 20, 30, 40]
var obj = book.get.bind(this, 10, 20);
get() 함수에 파라미터 이름을 작성하지 않고 arguments 사용
return Array.prototype.slice.call(arguments);
var result = obj(30, 40);
var book = {
myPoint: 100,
setEvent: function(){
var node = document.getElementById("point");
node.onclick = this.show.bind(book, node);
},
show: function(node, event){
log(node.textContent);
log(this.myPoint);
}
};
book.setEvent();
// 값 출력
// 100
시나리오
HTML 형태:
<script src="point.js" defer></script>
<button id=point>값 출력</button>
➡️bind()로 해결할 수 있음
document.getElementById("point");
node.onclick = this.show.bind(book, node);
show: function(node, event){
console.log(this.myPoint);