일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- java
- 디지털
- 스터디
- 컴퓨터공학
- 컴퓨터과학
- 정보처리기사
- 신입
- 스프링
- spring
- Effective Java
- 운영체제
- 뮤텍스
- OS
- 우리카드
- 공채
- 신입사원
- IT
- github
- 프로그래밍
- 세마포어
- 알고리즘
- 깃허브
- CS
- 깃
- package-private
- 메모리
- Public
- 자바
- 이펙티브 자바
- 개발
- Today
- Total
주니어 개발자 성장기
(22.10.26)var vm = this; 를 쓰는 이유 본문
정말 오랜만에 하는 포스팅이다.
Vue.js 강의 들으면서 프로젝트에 관한 것들을 많이 고민하다보니
블로그의 존재를 그만 잊어버린 듯 하다..
(지금 보다는 더 자주) 포스팅 주기를 좁혀야 겠다.
여튼 회사 프로젝트도 해야하고 백엔드 개발자로서 관리자 웹페이지 정도는 간단하게 만들 줄 알아야 한다는 생각이 들어서
9월말 부터 Vue.js를 공부하면서 코드도 짜보고 있다.
어제 아는 형의 코드를 보던 도중, 이해할 수 없는 부분을 발견했다.
export default {
mthods: {
var vm = this
// ...
// ...
},
}
Vue 내부에서 this를 쓰는 것이 아니라, this 대신 vm을 사용하는 것 이었다. 그래서 직접 물어봤는데 현업 개발자 분이
실무에서도 이렇게 쓴다고 이렇게 썼다고 했다.
Why?
그래서 왜 이런방식으로 진행하는 지 구글링으로 내용을 찾아 보았다.
이유는 꽤나 간단하면서도 이해하기가 어려운 부분이 있었다.
자바스크립트에서는 함수 내부에서 새로운 함수를 선언할 때, 즉, function() {} 문법의 내부에서는 새로운 context가 생성이 되고 이 때, this는 우리가 기대와는 다르게 Vue를 참조하지 않고 함수 그자체를 참조하고 있다. 다음 예시 코드를 보자.
AddTicket: function () {
// 여기서 "this"는 Vue를 가리킨다(참조한다.)
// 그러므로 여기서는 얼마든지 this를 통해 Vue의 data에 접근이 가능하다.
axios.post('/api/Tickets', ...)
.then(function (response) {
// 여기서의 "this"는 Vue를 참조하지 않는다!!
})
}
axios.post(....).then() 내부의 function() {} 문법으로 새로이 생성된 함수는 자신만의 context를 가지게 되며 따라서, this는 Vue가 아니라 함수 그 자체를 가리키게 되는것이다.
그래서 이를 해결하기 위한 방안은 2가지이다.
1. Arrow function. ( () => {} )
AddTicket: function () {
// 위와 같이 여기서는 "this"가 Vue를 가리킨다.
axios.post('/api/Tickets', ...)
.then((response) => {
// 여기서의 "this"도 Vue이다.
})
}
Arrow function 문법을 사용해서 함수를 선언하면 함수 자체적인 context를 만들지 않기 때문에 this를 써도 안전하다고 한다.
2. Closure
AddTicket: function () {
const self = this // 여기서 우리가 원하는 this의 참조를 저장해 놓는다.
axios.post('/api/Tickets', ...)
.then(function(response){
// 그리고 여기서는 "this"를 더 이상 쓸 수는 없지만, 대신
// 선언해 놓은 self 변수를 이용해 기존의 참조를 접근할 수 있다.
self.tickets = response
})
}
위와 같이 변수에 "this" 참조를 저장해 놓음으로써 새로운 함수 내부에서도 변수를 통해 접근 가능하도록 하는 방법도 있다.
이 방법이 바로 위에서 보았던
var vm = this; 이다.
3.bind method
bind라는 method를 사용하는 것인데, 요즘은 잘 쓰이지 않는다고 하니 그냥 패스하면 될것 같다.
오늘은 자바스크립트의 기본 문법에 대한 것을 알아 보았다.
끝!
참고:https://stackoverflow.com/questions/47148363/when-to-use-vm-or-this-in-vue-js (스택오버플로우)
'JavaScript' 카테고리의 다른 글
(22.10.11) ES6 - 모듈(Modules) (0) | 2022.10.11 |
---|---|
(22.10.10) ES6 - 향상된 객체 리터럴, 속성 메서드의 축약 (0) | 2022.10.10 |
(22.10.10) ES6 - 화살표 함수(Arrow Function) (0) | 2022.10.10 |
(22.10.10) ES6 - const & let (0) | 2022.10.10 |
(22.09.04) 자바스크립트 비동기 처리 관한 레퍼런스 (0) | 2022.09.04 |