繁体   English   中英

如何在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!');
            });
}

Javascript始终使用pass by value。 而当你给window.myHub作为参数传递给函数,你实际上由被称为在内存中的对象(值)的参考window.myHub

但是你的代码中没有用的是你在globalVar指向的内存中重新分配引用的对象:

globalVar = hub;

然后globalVar指的是hub中的任何内容。 即:你没有改变被引用值的值,你正在改变它所指向的值。

如果你这样做:

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

也就是说,全局变量的整个目的 - 例如窗口 - 是可以从程序中的任何地方访问它,你可以简单地避免将它作为参数传递,正如@NLN建议的那样,你可以简单地访问它从功能内部。

window.myHub作为undefined传递给SignalRSetUp()因为你在传递之前已经初始化了它。

window.myHub = "default value";

更重要的是,由于myHub是window范围的全局,因此您无需在函数中传递它 它将立即在SignalRSetUp()

干杯!

在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

这里有一个很好的参考

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM