2015-06-12 43 views
2

我需要一个全局变量“window.myHub”来设置哪个作为参数传递给函数(SignalRSetUp),如下所示:它现在传递的方式,不设置它!这怎么解决?如何在javascript中传递全局变量作为参数参考javascript

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!'); 
      }); 
} 
+2

* Window.myHub *的值为* undefined *,所以这是您传递给* SignalRSetUp *的值并分配给* globalVar *。你不能将一个引用传递给一个变量,你只能传递它的值(注意当你将一个对象赋值给一个变量时,赋值的值就是对该对象的引用)。 – RobG

+0

请设置window.myHub = {};然后看结果 –

+0

为什么你会这样做呢?为什么你不能简单地从该函数返回集线器? – Bergi

回答

2

JavaScript总是与价值传递。当你给window.myHub作为函数的参数时,你实际上会得到一个对window.myHub所指内存中对象(值)的引用。

但什么是不是在你的代码的工作,就是你重新分配内存中的引用对象的globalVar指出:

globalVar = hub; 

然后有globalVar指无论是在枢纽。即:您没有改变参考价值的价值,您正在改变它指向的内容。

如果你这样做:

var signalRSetUp = new SignalRSetUp(args,callBackFuncs, window); 

,然后在你的代码:

SignalRSetUp(argObj,eventFuncs,aWindow) { 
    //... 
    aWindow.myHub = hub; 
    //... 
} 

然后你会被替换对象aWindow内成员myHub的参考价值。

考虑到window.myHub是含undefined,那么你其实做的就是通过undefinedglobalVar,然后改变其中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 

这就是说,整个目的一个全局变量 - 比如窗口 - 就是它可以从prog中的任何地方访问ram,你可以简单地避免将它作为参数传递,就像@NLN所说的那样,你可以简单地从函数内部访问它。

+0

很好地解释了 – user2837167

+0

SignalRSetup()是一种通用的方法,所以任何人都可以使用它,只要您将预期的参数传递给它。所以它不知道哪个调用者想要设置哪个全局变量。因此我们希望发送作为参数。 – user2837167

+0

“Javascript总是与通过引用传递”错误。与Java一样,JavaScript始终都是按值传递的。 JavaScript中不存在传递引用。你所描述的正是“传递价值”的含义。 – newacct

2

window.myHub正在为undefinedSignalRSetUp()过去了,因为你havnt才通过初始化它。

window.myHub = "default value"; 

更重要的是,因为myHub是全局的window范围,你不需要它传递的功能。它将通过SignalRSetUp()直接提供。

干杯!

2

在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 

一个很好的参考是here

+0

好吧,从技术上讲,你说的是正确的,但即使它看起来像传递价值,你所指的文章是错的。 Javascript *总是*通过引用传递任何变量。只是基本类型变量是不可变的。当你做一个任务时,你并没有改变被引用的对象,你正在替换变量所引用的内容,从而有效地释放原始对象,并用新对象替换它。因为引用的对象是被调用者和被调用者之间共享的对象,所以一旦你松开它,就会失去与调用者的“连接”。 – zmo

+0

@zmo:不,JavaScript总是按价值传递。总是。就像Java一样。 JavaScript中没有引用。你所描述的正是“传递价值”的含义。 – newacct

+0

该死的,我不会删除那个评论,但重新阅读它会告诉我我是多么的错误。谢谢你的改正,并且我会失误! ;-) – zmo

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

你可以不传递全局对象,只是假定它是同一个对象(可能极有可能,但如果你使用框架可能是必需的),但你可能想要将其更改为其他对象来避免全局,在这种情况下,你可能只是传递对象周围,​​也许还会给它是一种获取和设置属性的方法。

+0

完美。感谢它的工作。 – user2837167

相关问题