Javascript 未捕获(承诺中)类型错误:无法设置属性';playerName';评估时未定义的

Javascript 未捕获(承诺中)类型错误:无法设置属性';playerName';评估时未定义的,javascript,vue.js,vuejs2,axios,Javascript,Vue.js,Vuejs2,Axios,我试图将GET请求中的response.data.response.displayName分配给我的playerName属性,但是,我得到一个错误“Uncaught(in promise)TypeError:无法设置eval时未定义的属性“playerName””。我正在成功地将控制台日志记录到response.data.response.displayName,因此其中有一个displayName。如果您能告诉我为什么会出现这个错误,我将不胜感激 export default { data

我试图将GET请求中的
response.data.response.displayName
分配给我的playerName属性,但是,我得到一个错误“
Uncaught(in promise)TypeError:无法设置eval时未定义的属性“playerName”
”。我正在成功地将控制台日志记录到
response.data.response.displayName
,因此其中有一个displayName。如果您能告诉我为什么会出现这个错误,我将不胜感激

export default {
  data: function() {
    return {
      playerName: ''
    }
  },
  methods: {

  },
  mounted() {
    axios.get('/User/GetBungieNetUserById/19964531/')
      .then(function(response) {
          this.playerName = response.data.Response.displayName
        console.log(response.data.Response.displayName)
      });
  }
}
使用lambda函数(箭头函数)到达代码

export default {
  data: function() {
    return {
      playerName: ''
    }
  },
  methods: {

  },
  mounted() {
    axios.get('/User/GetBungieNetUserById/19964531/')
      .then((response) => {
          self.playerName = response.data.Response.displayName
        console.log(response.data.Response.displayName)
      });
  }
}

其他注释和答案都是正确的-使用arrow/lambda函数而不仅仅是
函数
将起作用。但原因有细微差别

Javascript的
这个
的概念定义得很好,但并不总是你从其他语言中所期望的那样<当您从回调之类的子函数执行时,此
可以在一个范围块内更改。在您的情况下,
then
中的函数不再理解
这个
,就像您直接在
mounted()
中运行相同的代码一样

但是,您可以将函数绑定到(除其他用途外)附加了无法更改的特定
this
。箭头函数隐式地执行此操作,并将
绑定到创建箭头函数的上下文中的
。因此,该代码:

axios.get('/User/GetBungieNetUserById/19964531/')
  .then((response) => {
      this.playerName = response.data.Response.displayName
    console.log(response.data.Response.displayName)
  });
正确理解
。它(大致!)相当于以下内容:

axios.get('/User/GetBungieNetUserById/19964531/')
  .then((function(response) {
      this.playerName = response.data.Response.displayName
    console.log(response.data.Response.displayName)
  }).bind(this));

使用
(response)=>{this.playerName=…}
。使用
函数
关键字,您将丢失原来的
上下文箭头函数:
响应=>{this.playerName=/*…代码的其余部分*/}
Hmmm,因此在这种情况下必须使用箭头函数?您可以在axios调用之前执行
让它=此
,在回调函数中,使用
that
而不是
this
@Bobimaru不,您可以执行
函数(响应){/*code*/}.bind(this)
我正在做完全相同的事情,但我还是得到了错误。不过我使用了一个函数。我的问题似乎是我没有在“mounted()”中执行此操作。我想点击一个按钮就可以完成。