coffeescript的应用范围

coffeescript的应用范围,coffeescript,Coffeescript,我正在使用coffeescript开发一个web应用程序 我所有的类都在单独的文件中 这些类引用了几个全局常量(声明为my app) 我想从另一个文件main.coffee创建这些对象的实例 如何将类和常量放在应用程序作用域下?您需要使用--bare选项编译所有文件,该选项使所有类通过“全局”作用域(浏览器环境中的窗口变量)可用,或者您可以定义自己的window.MyNamespace={}并明确提供您的类,如: class MyClass ... window.MyNamespac

我正在使用coffeescript开发一个web应用程序

  • 我所有的类都在单独的文件中
  • 这些类引用了几个全局常量(声明为my app)
我想从另一个文件main.coffee创建这些对象的实例


如何将类和常量放在应用程序作用域下?

您需要使用
--bare
选项编译所有文件,该选项使所有类通过“全局”作用域(浏览器环境中的
窗口
变量)可用,或者您可以定义自己的
window.MyNamespace={}
并明确提供您的类,如:

class MyClass
   ...

window.MyNamespace.MyClass = MyClass

你已经标记了你的帖子
requirejs
,我相信它比我对你的问题给出的任何建议都有更好的模块结构解决方案,每个模块实例都被明确地传递,但是requirejs本身就是一个完整的主题。

我注意到100%了解amd的工作原理,但是,尽管有
MyNamespace
和使用
--bare
编译的选项,但在使用coffeescript编译器编译之前,您可以将文件压缩到一个“大”文件中。

其他答案表明了这一点,但您可能不想使用
--bare
编译,因为它将使文件中的所有顶级声明都是全局的:不仅是类,还有辅助函数、常量和仅在该文件中使用的东西,您可能不想将它们放入全局名称空间

最好是显式的,并使用
class window.MyClass
,这将把该类放在全局命名空间中

或者更好的方法是,如果您的应用程序有一个名称空间,比如在您声明的文件中:

# Namespace for application stuff.
window.App = {}
然后,您可以通过以下方式将类放入该名称空间:

# In another file; make sure the first file gets executed before so `App` exists.
class App.MyClass
然后,您可以通过引用该类(包括其命名空间),从任何地方实例化并使用该类:

c = new App.MyClass
c.someMethod()

你应该发布一些例子来展示你的代码是如何构造的。是的,同意@AlexWayne。我发布了一个答案,但是现在我看到这个问题被标记为
requirejs
,如果你正在使用一个工具来管理这样的依赖关系,那么名称空间一下子就没有什么意义了;你可以只使用局部变量,这是很棒的=D——我想裸操作不是一个好的做法。我想避免这种情况。问题是我的类使用main.coffee中声明的应用程序常量。所以我不确定先加载哪些文件。拥有一个只有应用程序常量的文件看起来不是一个好选择。@AkshayAurora它看起来像是某种循环依赖性问题。JS有这些问题,特别是当考虑到文件被执行时(它们毕竟是脚本)。我建议您花点时间来清楚地识别依赖项,然后根据这些依赖项来布局类/模块。我现在正在研究requirejs选项。我将为此单独发布一个问题。