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

标签 javascript pass-by-reference

我需要一个全局变量“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/

相关文章:

javascript - Lodash - 如何从嵌套的json中一次只选择一项?

javascript - 使用绑定(bind)的习惯用法

c++ - 通过引用 vector 给出错误的结果

javascript - 如何通过引用传递变量?

javascript - 将 HTMLDocument 转换为可打印的字符串

javascript - 如何在 canplay 事件中设置 HTMLMediaElement 的 .currentTime,调用播放并避免调度暂停事件?

javascript - 图像左侧的空白

pointers - 接口(interface)的golang地址和接口(interface)区别

Python Lambda 可变性

c++ - 引用 std::thread 参数