vue에서 setTimeout에 익명함수 넣고, 그 내부에서 this로 함수를 호출하면 is not a function
에러가 발생합니다.
<template>
<div>
안녕하세요
</div>
</template>
<script>
export default {
name: 'App',
created() {
setTimeout(function() {
console.log('this', this) // window
this.sayHi()
})
},
methods: {
sayHi() {
console.log('sayHi')
}
}
}
</script>
자바스크립트 this는 4가지 상황에서 의미가 다릅니다.
setTimeout의 첫번째 인자로 익명 함수 function() {}
을 전달했고 일반함수처럼 호출됩니다.
호출되는 상황에 따라 동적으로 this가 결정되는 일반함수와 다르게 화살표 함수는 선언 시점에 this가 정의됩니다.
화살표 함수 내부에는 this가 없기 때문에 상위 스코프로 올라가다가 가장 유사한 환경을 만나면 탐색을 그만둡니다.
가장 먼저 만나게 되는 this는 vue 인스턴스 이기 때문에 vue인스턴스가 바인딩됩니다.
setTimeout(() => {
console.log('setTimeout', this) // proxy
this.sayHi()
})
음 인스턴스를 다른 변수에 참조걸어놓고 사용하는건데, 조금 비효율적
const vm = this
setTimeout(function() {
console.log('setTimeout', vm) // Proxy {sayHi: ƒ, a: ƒ, …}
vm.sayHi()
})
익명함수에 this를 바인딩 하는 방법
참고로 화살표함수는 바인딩 안된다.
setTimeout(function() {
console.log('setTimeout', this)
this.sayHi()
}.bind(this))
this 언제 어떻게 사용되는지 잘 알아보고
화살표 함수 잘 사용하자.