如何在浏览器中使用CoffeeScript正确定位函数?

时间:2011-12-07 14:18:25

标签: javascript coffeescript scope

(->
  jQuery ->
    globalThis = @
    $('#emailTypes').change ->
      globalThis.toggleEmailOptions()

  toggleEmailOptions = ->
    $('.emailTypeOptions').fadeOut 'fast', ->
      for emailType in $('#emailTypes').val()
        $("##{emailType}Options").fadeIn()


).call this

这是我的.coffee文件。但是,toggleEmailOptions函数不在jQuery ready的范围内。我怎样才能在范围内制作它?

3 个答案:

答案 0 :(得分:2)

来自http://jashkenas.github.com/coffee-script/

  

关于CoffeeScript的常见警告适用 - 您的内联脚本会   在闭包装中运行,所以如果你想暴露全局   变量或函数,将它们附加到窗口对象。

如果您正在使用node.js,请绑定到exports

对于您的示例,它变为:

window.toggleEmailOptions = ->

答案 1 :(得分:1)

我认为你不需要换行,因为coffeescript已经这样做了,这就是我将如何重写你的代码:

jQuery ->
  toggleEmailOptions = ->
    $('.emailTypeOptions').fadeOut 'fast', ->
      for emailType in $('#emailTypes').val()
        $("##{emailType}Options").fadeIn()

  $('#emailTypes').change ->
    toggleEmailOptions()

答案 2 :(得分:0)

这里有几个问题。一个是你似乎假设@ / this是来自jQuery回调的全局对象(window)。但很容易看出它不是:

jQuery -> console.log @ is window  # false

请记住,可以在库所需的任何上下文中调用回调。在这种情况下,@document。并且document.toggleEmailOptions不存在。

此外,如果您希望toggleEmailOptions成为全球性的,则需要将其附加到window(或@ / this,因为@ is window文件的最外层范围)。那是因为当您只编写toggleEmailOptions = ...时,CoffeeScript使用var声明将其范围限定在文件中。通过查看已编译的JS很容易看到这一点:var始终位于其范围的顶部。幸运的是,文件范围无论如何都是你想要的。

所以基本上:不要过度思考它!你想要的是:

jQuery ->
  $('#emailTypes').change ->
    toggleEmailOptions()

并保持原样。