当前位置: 首页 > 面试题库 >

VueJS:为什么“ this”未定义?

左丘季
2023-03-14
问题内容

我正在使用Vue.js创建一个组件。

当我引用this中的任何所述的生命周期钩(createdmountedupdated等等)它的计算结果为undefined

mounted: () => {
  console.log(this); // logs "undefined"
},

我的计算属性内部也发生了同样的事情:

computed: {
  foo: () => { 
    return this.bar + 1; 
  } 
}

我收到以下错误:

未捕获的TypeError:无法读取未定义的属性“ bar”

为什么thisundefined在这些情况下进行评估?


问题答案:

这两个示例都使用arrow函数()=>{},该函数绑定this到与Vue实例不同的上下文。

根据文档:

不要在实例属性或回调(例如vm.$watch('a',newVal=>this.myMethod()))上使用箭头功能。由于箭头函数绑定到父上下文,因此this将不会是您期望的Vue实例,并且this.myMethod将是未定义的。

为了获得对thisVue实例的正确引用,请使用常规函数:

mounted: function () {
  console.log(this);
}

另外,您也可以使用ECMAScript 5速记功能:

mounted() {
  console.log(this);
}


 类似资料:
  • 为什么要用 this? 如果对于那些老练的 JavaScript 开发者来说 this 机制都是如此的令人费解,那么有人会问为什么这种机制会有用?它带来的麻烦不是比好处多吗?在讲解 如何 有用之前,我们应当先来看看 为什么 有用。 让我们试着展示一下 this 的动机和用途: function identify() { return this.name.toUpperCase(); } f

  • 问题内容: 在严格模式下使用javascript时,为什么在匿名函数中未定义此函数?我知道为什么这样做可能有意义,但是我找不到任何具体答案。 例: 问题答案: 这是因为,在ECMAscript 262第5版之前,如果使用的人忘记使用该关键字,那会造成很大的混乱。如果在ES3中调用构造函数时忘了使用,请引用全局对象(在浏览器中),然后用变量破坏全局对象。 这是可怕的行为等人在ECMA决定,只是为了集

  • 问题内容: 我有一个javascript类,每个方法都返回一个Promise。我想知道为什么在和中未定义。有没有更正确的方法来编写此代码? 我可以使用以下方法解决此问题: 但是不能完全确定为什么有必要。正在消灭? 问题答案: 始终是调用方法的对象。但是,将方法传递给时,您不会调用它!该方法将存储在某个地方,稍后再从那里调用。如果要保存,则必须这样做: 或者,如果您必须在ES6 之前的版本中进行操作

  • 什么是 this? 我们已经列举了各种不正确的臆想,现在让我们把注意力转移到 this 机制是如何真正工作的。 我们早先说过,this 不是编写时绑定,而是运行时绑定。它依赖于函数调用的上下文条件。this 绑定与函数声明的位置没有任何关系,而与函数被调用的方式紧密相连。 当一个函数被调用时,会建立一个称为执行环境的活动记录。这个记录包含函数是从何处(调用栈 —— call-stack)被调用的,

  • 问题内容: 我有一个javascript类,每个方法都返回一个Promise。我想知道为什么在和中未定义。有没有更正确的方法来编写此代码? 我可以使用以下方法解决此问题: 但是不能完全确定为什么有必要。正在消灭? 问题答案: 始终是调用方法的对象。但是,将方法传递给时,您不会调用它!该方法将存储在某个位置,稍后再从那里调用。如果要保存,则必须这样做: 或者,如果您必须在ES6之前的版本中执行此操作

  • 问题内容: var x int done := false go func() { x = f(…); done = true } while done == false { } 这是Go代码。我的恶魔告诉我,这是UB代码。为什么? 问题答案: Go Memory Model不保证该程序将始终遵守在goroutine中写入x的值。go常规销毁 部分中提供了一个类似的错误程序作为示例。 在本节中,G