Javascript signar客户端回调是对象函数和';这';

Javascript signar客户端回调是对象函数和';这';,javascript,signalr,Javascript,Signalr,我在试验信号器。当我的客户机定义的回调是一个属于javascript对象的方法时,那么在该函数内部(从SignalR调用时),“this”指的是集线器对象。我的问题是如何获取容器javascript对象以便访问其变量和函数 var gameLoad = { init: function () { // create the network object and hook it's functions update for loading this.net

我在试验信号器。当我的客户机定义的回调是一个属于javascript对象的方法时,那么在该函数内部(从SignalR调用时),“this”指的是集线器对象。我的问题是如何获取容器javascript对象以便访问其变量和函数

var gameLoad = {

    init: function () {
        // create the network object and hook it's functions update for loading
        this.network = $.connection.testHub;
        console.log(this.network);
        this.network.client.hello = this.sayHello;
    },

    // called from signalR 'this' is the network hub object now when inside the function
    sayHello: function () {
        console.log("Test 2!");
        console.log(this);  // <-- this isn't gameLoad object it's SignalR object. how do I access gameLoad object properties/methods?

        play.update();
    },

    create: function () {
        var self = this;
        console.log(this.network);

        // switch to play state passing network along so it can bind to some of it's function
        $.connection.hub.start().done(function () {
            console.log("Started!")
            console.log("Calling server function.");

            // make our first network call
            self.network.server.hello();
        });
    }
};
var gameLoad={
init:函数(){
//创建网络对象并钩住它的函数更新以加载
this.network=$.connection.testHub;
console.log(this.network);
this.network.client.hello=this.sayHello;
},
//从信号器调用“this”现在是函数内部的网络集线器对象
sayHello:function(){
log(“测试2!”);

console.log(this);//您正在创建一个对象并将其存储在一个名为gameload的变量中,因此您可以通过gameload变量访问该对象:

var gameLoad = {
    foo: "foo",
    bar: function() {
        console.log(gameLoad.foo);
    }
};

gameLoad.bar();

编辑:

我不认为下一个建议算作答案,因为您特别要求使用JavaScript,但在编写JavaScript时,我使用TypeScript

TypeScript有助于为代码提供更多的结构,并提供有用的功能,如能够将“this”保留为“您正在操作的对象”

编辑2:

如果要使用构造函数,则可以将“this”保存到构造函数中的变量中

function Foo() {
    var self = this;

    this.Bar = "Bar";

    this.Baz = function () {
        console.log(self.Bar);  
    };
}

var foo = new Foo();
foo.Baz();

TypeScript也是这样处理的:

编辑3:

此示例显示了“self”是如何可用的,即使“This”已更改

它使用jqueryclick事件而不是signer来更改“this”

输出:

Undefined
button
Bar

是的,我知道我可以通过对象名本身访问它,在这种情况下它可以工作,但是如果我使用class和new来创建对象呢?我会尝试一下,并给出我写的答案。希望编辑也能满足这种好奇心!新的ES6似乎给了我们Javascript中的“类”(不必使用Typescript)。在那里,它看起来不像我可以在函数外部执行var self=这个想法。我可以在构造函数()内部执行这个。self=这个,但没有帮助,因为在singalR回调中,它不再引用该类。如果查看EDIT 2,它显示了一个示例,说明如何在不执行“this.self”的情况下使用“self”。如果signer调用了this.Baz,则“self”通过闭包传递,并且仍然可用,即使“this”现在不同了。对于ES6,它很好,但浏览器还不完全支持它。TypeScript允许您使用ES6功能并编译到ES5,并且它在编译时提供类型检查,ES6甚至没有接近它;)我添加了Edit3以显示通过闭包传递“self”即使在“this”时也可以正常工作已被函数调用方修改。
Undefined
button
Bar