javascript - push()函数undefined
PHP中文网
PHP中文网 2017-04-11 12:11:33
[JavaScript讨论组]

想把连接websocket的ws export出去后在别的地方拿到resList

var websocket = null;
const ws = {
    resList:[],
    socket:null,
    init:function () {
        websocket = new WebSocket("ws://127.0.0.1:8006");
        websocket.onopen = function (evt) {
            var _this = this;
            console.log("连接到websocket服务端");
            websocket.send('{"manager_mac": "000C43E11203","manager_id": "1"}');
        };
        websocket.onclose = function (evt) {
            console.log("关闭socket");
        };
        websocket.onmessage = function (evt) {
            var _this = this;
            console.log('接收服务端推送的信息: ' + evt.data);
            _this.resList.push(evt.data);
        };
        websocket.onerror = function (evt) {
            console.log('socket连接错误: ' + evt.data);
        };
        this.socket = websocket;
    },
    // send:function (msg) {
    //     websocket.send(msg);
    // },
    // clearResList:function () {
    //     var _this = this;
    //     _this.resList = [];
    // }
}

export default ws

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(4)
高洛峰
var websocket = {}
var ws = {
    resList: [],
    socket:null,
    init: function() {
        websocket.onopen = function() {
            var _this = this
            console.log(_this)
        }
    },
}

ws.init()
websocket.onopen()

在google chrome 的console中cv以上代码,这是你的代码简化版,可以看到输出的_this指向websock对象,因为此时调用onopen方法的是websock,符合this的隐式绑定原则;我们把var _this = this 移到init()作用域,就像这样:

var websocket = {}
var ws = {
    resList: [],
    socket:null,
    init: function() {
        var _this = this
        websocket.onopen = function() {
            console.log(_this)
        }
    },
}

ws.init()
websocket.onopen()

再输出就发现,_this将init()的this带了进来,因为init()由ws调用,所以他的this指向ws,从而_this也指向ws,符合你的要求

如果你对this绑定有疑问,可以参考我的博客

或者,如果你们使用es6的话,可以使用胖箭头函数:

var websocket = {}
var ws = {
    resList: [],
    socket:null,
    init: function() {
        websocket.onopen = () => {
            console.log(this)
        }
    },
}

ws.init()
websocket.onopen()
PHP中文网

你的this指向的不是你声明的ws了吧,在websocket.onmessage 中

巴扎黑

var _this = this; 的位置不对吧,应该放到紧跟着 init: function () { 的地方。

伊谢尔伦

打印下_this 大致可以知道问题出再哪里

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号