自执行方法中的 Javascript 范围访问

标签 javascript ruby-on-rails coffeescript gmaps4rails

在定义模块模式时,我对一个问题感到非常困惑( 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/

相关文章:

javascript - 清空数组并清除 Javascript 中的所有间隔

javascript - jQuery 在 div onClick 中加载内容

ruby-on-rails - Rails 3 和 Cucumber - 创建关联的步骤定义

ruby-on-rails - 以表单形式构建嵌入的 mongoid 文档

javascript - 在 View 的事件属性中使用 backbone.js 监听与 @el 相关的事件

javascript - Node js应用程序变量未在coffeescript中定义

javascript - CSS:隐藏另一个div

javascript - 对象解构并立即返回

ruby-on-rails - 在Rails Controller 中获取Carrierwave上传的文件名

jquery - 检查输入值 > 0 jQuery Coffee