반응형
[js] 객체안에서 함수를 사용하는 방법, 조심해야할 점
1. 객체안에서 함수를 사용하는 4가지 방법
const buttonData = [
{
btnBlue: "로그인",
active: function test() {
console.log("파란색 로그인버튼 눌림!");
},
},
{
btnBlue: "검색",
active: function () {
console.log("파란색 검색버튼 눌림!");
},
},
{
btnWhite: "로그인",
active() {
console.log("하얀색 로그인 버튼 눌림!");
},
},
{
btnWhite: "검색",
active: () => {
console.log("하얀색 검색버튼 눌림!");
},
},
];
buttonData[0].active();
buttonData[1].active();
buttonData[2].active();
buttonData[3].active();
위 buttonData 배열안의 네 객체 안에서 함수는 모두 정상적으로 동작한다.
출력값
파란색 로그인버튼 눌림!
파란색 검색버튼 눌림!
하얀색 로그인 버튼 눌림!
하얀색 검색버튼 눌림!
2. 조심해야할 점
const buttonData = [
{
btnBlue: "로그인",
active: function test() {
console.log(`파란색 ${this.btnBlue}버튼 눌림!`);
},
},
{
btnBlue: "검색",
active: function () {
console.log(`파란색 ${this.btnBlue}버튼 눌림!`);
},
},
{
btnWhite: "로그인",
active() {
console.log(`파란색 ${this.btnWhite}버튼 눌림!`);
},
},
{
btnWhite: "검색",
active: () => {
console.log(`파란색 ${this.btnWhite}버튼 눌림!`);
//"TypeError: Cannot read property 'btnWhite' of undefined." 에러 출력
},
},
];
buttonData[0].active();
buttonData[1].active();
buttonData[2].active();
buttonData[3].active();
1. buttonData[0].active(), buttonData[1].active(), buttonData[2].active()는 정상동작한다.
2. buttonData[3].active()는 정상적으로 동작하지 않는다.
3. 이유는 function 키워드를 사용하는 것이 아니라 화살표 함수를 사용하게 되면 this가 무엇인지 알지못한다.
4. function으로 만들었을때 this는 자신이 속해있는 곳을 가리키게 되는데, 화살표함수에서는 this를 자신이 속해있는 곳으로 연결하지 않는다.
5. 따라서 제대로 동작하지 않고 출력값은 아래와 같다.
출력값
파란색 로그인버튼 눌림!
파란색 검색버튼 눌림!
파란색 로그인버튼 눌림!
파란색 undefined버튼 눌림!
예)
const sayHi = {
word: "hi",
say() {
console.log(this.word);
}
};
const sayHello = {
word: "hello"
};
sayHello.say = sayHi.say; // sayHello.say에 sayHi.say를 연결
console.log(sayHello)// { word: "hello", say: [Function: say] } 출력
sayHello.say(); // "hello" 출력
const say = sayHello.say; // say에 sayHello.say를 연결
console.log(say) // [Function: say] 출력
say(); // undefined 출력
sayHello.say에 등록된 함수에서 this는 hello을 가리키기 때문에 this.word는 "hello"가 되고, "hello"가 출력된다.
{ word: "hello", say: [Function: say] }
"hello"
say는 연결되어 있는 객체가 존재하지 않고, 호출 시 this가 존재하지 않아 undefined가 되고 에러가 발생한다.
[Function: say]
undefined
반응형
'언어 > Javascript, Typescript' 카테고리의 다른 글
AJAX란?, AJAX사용방법 (0) | 2023.03.29 |
---|---|
[js] 현재 페이지 URL 관련 정보를 가져오기 (0) | 2023.03.28 |
[js] Dayjs 라이브러리 (설치방법, i18n, 객체생성, get(), set(), DateFormat 설정 등) (0) | 2023.03.24 |
[js] 자바스크립트 Date객체 (기간 조회 및 날짜 계산) (0) | 2023.03.24 |
[js] 콜백지옥 코드 수정 (0) | 2023.03.23 |
댓글