vue中使用websocket,无法调用methods

export default{
    methods:{
        test(){
            console.log('test');
        },
        socket(){
           var socket = new WebSocket("ws:url");
           socket.onmessage=function(event){
               this.test();
           }
        }
    }
}

报错提示test不是一个method

阅读 11.2k
2 个回答

作用域问题。把this实例存为_this,回调函数里面就能访问到了。

export default{
    methods:{
        test(){
            console.log('test');
        },
        socket(){
           var socket = new WebSocket("ws:url");
           var _this = this;
           socket.onmessage=function(event){
               _this.test();
           }
        }
    }
}

应该是this指向问题,不是作用域问题。编译的时候形成作用域,this指向在执行的时候确定的。
箭头函数比较特别,其中的this是在定义的时候确定的,指向定义时所在的对象而不是调用时所在的对象。

//这样写的,函数作为socket的一个属性,其中的this指向socket。
socket.onmessage=function(event){
       this.test();
   }

该例子:箭头函数写法时,严格模式下this为undefined,非严格模式下,this指向window,在vue中,this被绑定到实例上,指向VueComponent。

socket.onmessage=(event) => {
       this.test();
   }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题