Javascript范围访问自执行方法

时间:2014-08-17 09:20:49

标签: javascript ruby-on-rails coffeescript gmaps4rails

在定义模块模式(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')
)()

按预期工作。

我到底错过了什么?

1 个答案:

答案 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 ->而不是较少惯用的( -> ...)()