我有两个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访问它只会获得未定义
答案 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
。