在定义模块模式(http://robots.thoughtbot.com/module-pattern-in-javascript-and-coffeescript)时,我对问题很困惑:
以下代码作为exepted(CoffeeScript)工作:
window.Map = {}
Map.handle = ( ->
handle = 'some text'
print: () ->
console.log handle
)()
现在如果我用全局范围内可用的库中的方法替换'some text'
(即gmaps4rails:https://github.com/apneadiving/Google-Maps-for-Rails):
window.Map = {}
Map.handle = ( ->
handle = Gmaps.build('Google')
print: () ->
console.log handle
)()
代码不起作用且抛出Map.handle
未定义。所以我认为这是一个范围问题,所以我尝试将Gmaps.build('Google')
作为参数传递给匿名函数,但它失败了。
Gmaps.build自从执行以来正常工作:
window.Map = {}
Map.handle = ( ->
mapBuildFx = () ->
handle = Gmaps.build('Google')
)()
按预期工作。
我到底错过了什么?
答案 0 :(得分:1)
当我尝试任何版本的代码时,我会获得ReferenceError: Map is not defined
。
我不知道这是否真的是您的问题,但至少,您忘了将Map
视为window.Map
:
window.Map = {}
window.Map.handle = ( ->
handle = Gmaps.build('Google')
print: () ->
console.log handle
)()
# Use `print` like that:
do window.Map.handle.print
# or
window.Map.handle.print()
未使用Gmaps进行测试
不考虑其他一些小错误和/或Gmap特性(?),并回答标题为:自动执行方法中的Javascript范围访问:
在该片段中,handle
是匿名函数的本地。所以它在其定义的任何地方都可见 - 甚至在子功能中也是如此。但除非你让它以某种方式逃脱,否则它将被隐藏在外面:
coffee> console.log window.Map.handle
{ print: [Function] }
顺便说一下,你可能在函数定义中使用了do ->
而不是较少惯用的( -> ...)()
。