我需要一个全局变量“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!');
});
}
最佳答案
Javascript 始终使用按值传递。当您将 window.myHub
作为函数的参数时,您实际上获得了对内存中由 window.myHub
引用的对象(值)的引用。
但在您的代码中不起作用的是,您正在重新分配 globalVar
指向的内存中的引用对象:
globalVar = hub;
然后 globalVar
引用 hub 中的任何内容。即:您不是在更改引用值的值,而是在更改它指向的内容。
如果你这样做:
var signalRSetUp = new SignalRSetUp(args,callBackFuncs, window);
然后在您的代码中:
SignalRSetUp(argObj,eventFuncs,aWindow) {
//...
aWindow.myHub = hub;
//...
}
然后您将替换对象 aWindow
中成员 myHub
的引用值。
考虑到 window.myHub
包含 undefined
,那么您实际要做的是将 undefined
作为 globalVar
传递,然后更改 globalVar
指向的位置:
这是您开始时的变量:
memory: [xxxxxxxxxxx]
^
|
window.myHub
然后调用函数SingalRSetUp
:
globalVar
|
v
memory: [xxxxxxxxxxx]
^
|
window.myHub
然后您将其他内容分配给 globalVar
:
globalVar
|
v
memory: [xxxxxxxxxxx|yyyyyyyyyyy]
^
|
window.myHub
当我建议您传递任何类型的可变对象(无论是数组还是对象)时,您都可以在整个程序中引用该对象这一事实,它将负责成为正确引用的某种“注册表”(也许我们可以找到一个更好的词):
aWindow aWindow.myHub
| |
v v
memory: [xxxxxxxxxxx|yyyyyyyyyyy]
^ ^
| |
window window.myHub
也就是说,全局变量(例如 window)的全部目的是可以从程序中的任何位置访问它,并且您可以简单地避免将其作为参数传递,正如@NLN 所建议的那样,您可以只需从函数内部访问它即可。
关于javascript - 如何在javascript中通过引用将全局变量作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30796909/