我需要一个全局变量" window.myHub"设置哪个作为参数传递给函数(SignalRSetUp)如下:它现在传递的方式,不设置它!怎么能解决这个问题?
var args = {
"userObjectId": UserObjectId,
"hubURL": LCSHubApiURL,
"hubName": HubProxyName,
}
var callBackFuncs = {
"ping": PingFunc
}
window.myHub;
var signalRSetUp = new SignalRSetUp(args,callBackFuncs, window.myHub);
SignalRSetUp(argObj,eventFuncs,globalVar)
{
var $self = this;
var connection = $.hubConnection(argObj.hubURL);
var hub = connection.createHubProxy(argObj.hubName);
hub.connection.qs = { "objectid": argObj.userObjectId };
//Wire : Call back functions and the Hub events
for (var e in eventFuncs) {
hub.on(e, eventFuncs[e]);
//hub event fail
}
connection.start()
.done(function () {
globalVar = hub;
})
.fail(function (error) {
console.log('Could not Connect!');
});
}
答案 0 :(得分:4)
Javascript始终使用pass by value。当您将window.myHub
作为参数提供给函数时,实际上会获得window.myHub
引用的内存中对象(值)的引用。
但是你的代码中没有用的是你在globalVar
指向的内存中重新分配引用的对象:
globalVar = hub;
然后globalVar
指向集线器中的任何内容。即:您不会更改所引用值的值,而是改变它所指向的值。
如果你这样做:
var signalRSetUp = new SignalRSetUp(args,callBackFuncs, window);
然后在你的代码中:
SignalRSetUp(argObj,eventFuncs,aWindow) {
//...
aWindow.myHub = hub;
//...
}
然后您将替换对象myHub
中成员aWindow
的引用值。
考虑到window.myHub
包含undefined
,那么您实际执行的操作是将undefined
作为globalVar
传递,然后更改globalVar
指向的位置:< / p>
这是您开始时的变量:
memory: [xxxxxxxxxxx]
^
|
window.myHub
然后你调用函数SingalRSetUp
:
globalVar
|
v
memory: [xxxxxxxxxxx]
^
|
window.myHub
然后您将其他内容分配给globalVar
:
globalVar
|
v
memory: [xxxxxxxxxxx|yyyyyyyyyyy]
^
|
window.myHub
当我建议您传递任何类型的可变对象(无论是数组还是对象)时,您可以使用在整个过程中引用此对象的事实程序,它将负责成为某种&#34;注册表&#34; (也许我们可以找到一个更好的词)正确的参考文献:
aWindow aWindow.myHub
| |
v v
memory: [xxxxxxxxxxx|yyyyyyyyyyy]
^ ^
| |
window window.myHub
也就是说,全局变量的全部目的 - 例如窗口 - 是可以从程序中的任何地方访问它,你可以简单地避免将它作为参数传递,正如@NLN建议的那样,你可以只需从函数中访问它。
答案 1 :(得分:2)
window.myHub
作为undefined
传递给SignalRSetUp()
,因为您在传递之前已经初始化了它。
window.myHub = "default value";
更重要的是,由于myHub是window
范围的全局,你不需要在函数中传递它。它将直接在SignalRSetUp()
中提供。
干杯!
答案 2 :(得分:2)
在window.myHub中发送时,您正在传递值。发送参数为&#34; window&#34;如果你想通过引用传递。
例如
SignalRSetup(argObj,eventFuncs,globalVar) {
.....
globalVar.myHub = hub
}
var signalRSetUp = new SignalRSetUp(args,callBackFuncs, window);
// Now window.myHub will have the value from the method
一个很好的参考是here
答案 3 :(得分:1)
您可以通过传递变量的名称,然后将其作为全局对象的属性进行访问来实现,所以:
// Create global
var myHub;
var globalObj = this;
// Pass property name as a string and object to resolve it on
// as a reference
var signalRSetUp = new SignalRSetUp(args,callBackFuncs, 'myHub', globalObj);
// Resolve in callback
function SignalRSetUp(argObj, eventFuncs, globalVarName, globalVarObj)
{
...
.done(function () {
globalVarObj[globalVarName] = hub;
})
...
}
你无法传递全局对象而只是假设它是相同的(可能极有可能,但如果你可能需要使用帧),但你可能想要将它改为其他对象以避免全局,在这种情况下,你可能只是传递对象,也可能给它一个方法来获取和设置属性。