在定义模块模式时,我对一个问题感到非常困惑( http://robots.thoughtbot.com/module-pattern-in-javascript-and-coffeescript ):
以下代码片段的工作原理如下(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')
)()
按预期工作。
我到底错过了什么?
最佳答案
当我尝试使用您的代码的任何版本时,我都会收到ReferenceError: map 未定义
。
我不知道这是否真的是您的问题,但至少,您忘记将 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()
未使用 Gmap 进行测试
<小时/>抛开其他一些小错误和/或 Gmap 特性(?),并回答标题为:自执行方法中的 Javascript 范围访问:
在该片段中,handle
是匿名函数的本地函数。因此它在其定义内的任何地方都是可见的——甚至在子函数中。但除非你让它以某种方式逃脱,否则它将从外部隐藏起来:
coffee> console.log window.Map.handle
{ print: [Function] }
顺便说一句,您可能在函数定义中使用 do ->
而不是不太惯用的 ( -> ...)()
。
关于自执行方法中的 Javascript 范围访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25347893/