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