Vue
로 작성한 코드를es6
로 변환중,methods
를 화살표 함수로 변환하는 과정 중this
가 값을 제대로 읽지 않음
<div id="app">
<button v-on:click="greet">인사하기</button>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
name: 'pang'
},
methods: {
greet: function(event){ //변경할 부분
console.log(this.name);
alert('Hello ' + this.name + '!');
}
},
});
</script>
<div id="app">
<button v-on:click="greet">인사하기</button>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
name: 'pang'
},
methods: {
greet: (event) => { //변경된 부분
console.log(this.name);
alert('Hello ' + this.name + '!');
}
},
});
</script>
this.name
으로 data
의 name
값을 잘 받아오는데, 화살표 함수로 바꾸자마자 값을 제대로 받아오질 못한다.this
와 화살표 함수의 this
는 다르다.자바스크립트의 경우 함수를 선언할 때 this
에 바인딩할 객체가 정적으로 결정되는 것이 아니고, 함수를 호출할 때 함수가 어떻게 호출되었는지에 따라 this
에 바인딩할 객체가 동적으로 결정된다.
메서드(일반 함수) 호출 시 내부 코드에서 사용된 this
는 해당 메서드를 소유한 객체, 즉 해당 메서드를 호출한 객체로 바인딩한다.
바인딩할 객체가 정적으로 결정된다.
화살표함수를 사용하게 된다면 자신의 this
가 없는 대신, 화살표 함수를 둘러싸는 렉시컬 범위(lexical scope)
의 this
로써 사용된다.
따라서 현재 범위에서 존재하지 않는 this
를 찾는다면 화살표 함수는 바깥 범위에서 this
를 찾기 때문에 일반적으로 화살표 함수에 this
를 사용하지 않는다.
화살표 함수와 this
는 따로쓰자...
조금이라도 코드를 줄이고 싶다면 속성에 함수를 정의할 때 function
예약어 생략하는 방식을 사용한다. 방법은 다음 코드와 같다.
변경 전 코드
<div id="app">
<button v-on:click="greet">인사하기</button>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
name: 'pang'
},
methods: {
greet: function(event){ //변경할 부분
console.log(this.name);
alert('Hello ' + this.name + '!');
}
},
});
</script>
<div id="app">
<button v-on:click="greet">인사하기</button>
</div>
<script>
var vm = new Vue({
el: '#app',
data: {
name: 'pang'
},
methods: {
greet (event) { //변경할 부분
console.log(this.name);
alert('Hello ' + this.name + '!');
}
},
});
</script>