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

How to pass a global variable as parameter by reference in javascript

我需要一个全局变量"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!');
            });
}

window.myHub 被作为 undefined 传递给 SignalRSetUp() 因为你在传递之前没有初始化它。

window.myHub = "default value";

更重要的是,由于 myHub 在 window 范围内是全局的,您不需要在函数中传递它。它将立即在 SignalRSetUp() 中提供。

干杯!

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

当我建议您传递任何类型的可变对象(无论是数组还是 对象 )时,您可以使用您正在引用的事实整个程序中的对象,它将负责成为某种 "registry"(也许我们可以找到一个更好的词)的正确引用:

          aWindow     aWindow.myHub
              |          |
              v          v
memory: [xxxxxxxxxxx|yyyyyyyyyyy]
              ^          ^
              |          |
            window    window.myHub

就是说,全局变量的全部目的——例如 window——是它可以从程序中的任何地方访问,你可以简单地避免将它作为参数传递,因为@NLN 建议,您可以简单地从函数内部访问它。

您在发送 window.myHub 时按值传递。如果您希望通过引用传递,请将参数作为 "window" 发送。

例如

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

您可以通过传递变量名,然后将其作为全局对象的 属性 来访问,因此:

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

您无法传递全局对象并假设它是同一个对象(可能极有可能,但如果您使用框架可能需要)但您可能想将其更改为其他对象以避免全局,其中如果你可能只是传递对象,也可能给它一个方法来获取和设置 属性.