如何在javascript中通过引用将全局变量作为参数传递

问题描述 投票:0回答:4

我需要一个全局变量“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 pass-by-reference
4个回答
5
投票

Javascript 始终支持按值传递。当您将

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
指向的位置:

这是您开始时的变量:

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 所建议的那样,您可以简单地访问它来自函数内部。


3
投票

window.myHub
正在作为
undefined
传递到
SignalRSetUp()
,因为您在传递之前尚未初始化它。

window.myHub = "default value";

更重要的是,由于 myHub 对于

window
范围是全局的,您不需要在函数中传递它。它将立即在
SignalRSetUp()
上架。

干杯!


3
投票

在 window.myHub 中发送时,您正在按值传递。如果您想通过引用传递,请以“窗口”形式发送参数。

例如

SignalRSetup(argObj,eventFuncs,globalVar) {
       .....
       globalVar.myHub = hub
}

var signalRSetUp = new SignalRSetUp(args,callBackFuncs, window);
// Now window.myHub will have the value from the method

一个很好的参考是这里


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;
            })
    ...
}

您无法传递全局对象并假设它是同一个对象(可能非常有可能,但如果您使用框架可能是必需的),但您可能希望将其更改为其他对象以避免全局对象,在这种情况下您可能只是传递对象,也许还给它一个获取和设置属性的方法。

© www.soinside.com 2019 - 2024. All rights reserved.