study blog
[JavaScript] this와 arrow function 연습 본문
this를 사용해 '안녕 나는 지지'를 출력해보자
문제
var 사람 = {
name: '지지',
}
사람.sayHi(); //안녕 나는 지지
나
var 사람 = {
name: '지지',
sayHi: function () {
console.log('안녕 나는');
return this.name
}
}
사람.sayHi();
살펴보니 return을 쓴 게 문제였다.
return은 콘솔창에 출력되지 않고, 값을 대체해준다.
그렇다면 console.log 안에 this를 사용해야 하며, arrow function은 사용하면 안 된다.
var 사람 = {
name: '지지',
sayHi: function () {
console.log('안녕 나는 ' + this.name);
}
}
사람.sayHi();
return에 대해 더 써보자면
function 계산(x) {
return x * x;
}
계산(3);
이렇게 쓰면 콘솔창에 아무 것도 찍히지 않는 반면
function 계산(x) {
return x * x;
}
console.log(계산(3)); //9
이렇게 console.log로 감싸게 되면 콘솔창에 찍히게 된다.
this를 사용해 오브젝트 안의 데이터를 전부 더해보자
문제 (중괄호 내에 코드 작성X)
var obj = {
data: [0,1,2,3,4]
};
obj.더하기();
중괄호 내에 코드를 작성하지 않으면서 obj의 배열을 가져와서 출력할 수 있어야하기 때문에
obj.더하기 = function () { }
이렇게 코드를 작성하고 기능을 개발해주면 된다.
이 코드는 중괄호 밖에서 함수를 작성해도 더하기라는 함수를 obj에 추가로 제작하여 포함되기 때문에 데이터를 받아올 수 있다.
(obj의 더하기 함수니까)
var obj = {
data: [0, 1, 2, 3, 4]
};
obj.더하기 = function () {
var 합 = 0;
this.data.forEach(function (a) {
합 = 합 + a;
});
console.log(합);;
}
obj.더하기();
setTimeout에서 this 사용
'버튼입니다'라는 버튼을 눌렀을 때 1초 뒤 콘솔창에 '버튼입니다'가 찍히게 해야한다.
document.getElementById('btn').addEventListener('click', function () {
setTimeout(function () {
console.log(this.innerHTML)
}, 1000)
});
처음에 이렇게 코드를 쓰니 undefined가 나왔다.
undefined가 나오는 이유는 this는 가장 가까운 function의(setTimeout 뒤) this이고 이 function은 일반 함수이기 때문에 window가 된다.
그렇다면 window의 innerHTML은? => 아무것도 안 나옴!
document.getElementById('btn').addEventListener('click', function () {
this.innerHTML
setTimeout(function () {
console.log(this.innerHTML)
}, 1000);
});
2번째 줄의 this.innerHTML은 잘 출력이 됐었으니 이 this값을 setTimeout에서도 쓸 수 있게끔 만들어야 한다.
이 때 arrow function을 사용해주자.
document.getElementById('btn').addEventListener('click', function () {
setTimeout( () => {
console.log(this.innerHTML)
}, 1000);
});
만약 arrow function이 아닌 기존 function 문법을 쓰고 싶다면 this값을 변수에다가 저장해주면 된다.
document.getElementById('btn').addEventListener('click', function () {
var 버튼 = this;
setTimeout(function () {
console.log(버튼.innerHTML)
}, 1000)
});
'제1장' 카테고리의 다른 글
[React] 폴더 생성/ JSX/ state/ onClick (0) | 2022.03.03 |
---|---|
[Node.js] REST API 란? (0) | 2022.03.02 |
[Node.js] 서버/ body-parser/ POST요청/ get() (0) | 2022.02.28 |
[Node.js] Node.js란?/ Node.js 설치/ Express 설치 (0) | 2022.02.27 |
[JavaScript] Arrow function (0) | 2022.02.26 |