vue项目中this指向作用域问题

  • cindy Liu
  • 1 Minutes
  • May 6, 2018

在methods中一个方法调用另一个方法

settime(e){ //验证码倒计时
   console.log('this is settime()')
},
getVerify:function(e){ //获取验证码
  this.settime(e)
}

但当我们使用ajax请求时会报出以下错误

this.settime is not a function

代码如下:

settime(e){ //验证码倒计时
      console.log('this is settime()')
   },
   getVerify:function(e){ //获取验证码
       $.get(BACK_END_SERVER + "/sms/verify", { "phone":this.form1.phone }, function (data) {
          this.settime(e)
       })
   },

这是因为this作用域指向问题,$get()函数实际是一个闭包,无法通过this来指定函数1
那么需要怎么修改呢?
我们通过当前对象赋予一个新的对象
var _this=this;
然后使用_this 来指定函数1就行了
完整代码

settime(e){ //验证码倒计时
    console.log('this is settime()')
},
getVerify:function(e){ //获取验证码
    var _this = this;
    $.get(BACK_END_SERVER + "/sms/verify", { "phone":this.form1.phone }, function (data) {
       _this.settime(e)
    })
},

另外说一下,在es6 ,使用箭头函数是不存在这个问题的
例如:
setTimeout( () => {
console.log(this.type + ‘ says ‘ + say)
}, 1000)

(详见上一篇笔记)

当我们使用箭头函数时,函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。
并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,它的this是继承外面的,因此内部的this就是外层代码块的this。