无法读取CoffeeScript全局变量

时间:2014-04-28 15:31:07

标签: javascript coffeescript

我有两个coffeescript文件,第一个有这些行:

jQuery(document).ready ($) ->
   dispatcher.bind "createuserchannel", (channelid) ->
     root = (exports ? this)
     root.channel_user = dispatcher.subscribe(channelid)

以及后者:

jQuery(document).ready ($) ->
 root = (exports ? this)
 console.log root.channel_user

我不知道为什么但是在Chrome控制台中我写Object.keys(window)channel_user显示为全局变量,但如果我尝试从Javascript访问它只会获得未定义

2 个答案:

答案 0 :(得分:1)

在jQuery事件的内部回调(例如你的第二种情况)中,jQuery将this设置为触发事件的对象(在本例中为document)。我看到了两个选项:

首先,您可以明确使用window。目前尚不清楚这是否适合您的用例。

root = (exports ? window)

其次,您可以使用CoffeeScript胖箭头从外部范围保留this。请注意,如果您依赖于该函数中其他任何位置的其他this行为,则会导致问题。

jQuery(document).ready ($) =>

我认为在你的第二种情况下会发生同样的事情,但是如果不确切知道dispatcher究竟是什么,那就无法确定。

答案 1 :(得分:0)

解决:

dispatcher.bind是一个异步函数,所以当我从这个函数访问变量时:

jQuery(document).ready ($) ->
 root = (exports ? this)
 console.log root.channel_user

仍未分配channel_user。 为了解决这个问题,我添加了这一行:

jQuery(document).ready ($) ->
     dispatcher.bind "createuserchannel", () ->
      root = (exports ? this)
      console.log root.channel_user

这样,只有在设置了root.channel_user后才会调用channel_user