问题描述
好的,我想谈谈3种情况。我知道箭头函数具有词法作用域,并且将向外传播,直到找到匹配项为止。但是,在某些情况下,这些行为对我来说是没有意义的,因此,进行一些解释会很好。
1。在单个文件组件的methods
// HelloWorld.vue
<template>
<div class="hello">
<h1>{{ msg }}</h1>
<button @click="nonArrow">click me</button>
</div>
</template>
<script>
export default {
name: 'HelloWorld',props: {
msg: String
},methods: {
nonArrow() {
console.log(this);
},arrow: () => {
console.log(this);
}
}
}
</script>
nonArrow()
照常显示VueComponent
实例。 arrow()
显示undefined
,但不显示window
吗?
2。脚本标记中的Vue内部组件。
new Vue({
el: '#app',data: {
},methods: {
noArrow() {
console.log(this);
},arrow: () => {
console.log(this);
}
})
noArrow()
给出一个Vue
实例,但是arrow()
给出一个window
对象。为什么在上一个示例中未引用window
?
3。使用严格模式
methods: {
noArrow() {
console.log(this);
},arrow: () => {
"use strict";
console.log(this);
}
}
在第二个示例中,如果我在方法内部使用带有箭头功能的严格模式,它仍会输出window
对象,而在外部以严格模式定义的普通箭头函数将控制台日志undefined
。这是怎么回事?
解决方法
不要在options属性或回调中使用箭头函数,例如创建的()=> console.log(this.a)或vm。$ watch('a',newValue => this.myMethod() )。由于箭头函数没有this,因此将其视为任何其他变量,并在父作用域中进行词法查询,直到找到为止,这通常会导致错误,例如Uncaught TypeError:无法读取undefined或Uncaught TypeError:this.myMethod不是功能。
您不应使用箭头功能。请参考此链接。