coffeescript中的应用范围

问题描述:

我正在使用coffeescript编写Web应用程序。coffeescript中的应用范围

  • 我有所有类在单独的文件。
  • 这些类指的是少数全局常量(声明为我的应用程序)。

我想从另一个文件main.coffee创建这些对象的实例。

如何在应用程序范围内使用类和常量?

+0

你应该pos举例说明你的代码是如何构建的。 – 2013-02-21 19:29:18

+0

是的,同意@AlexWayne。我发布了一个答案,但现在我看到这个问题被标记为'requirejs',如果您使用的是一种工具来管理这样的依赖关系,那么命名空间突然没有太多意义;你可以通过只使用局部变量得到,它很棒= D – epidemian 2013-02-21 23:53:29

您也需要通过“全局”范围(在浏览器环境中window变量)来编译与--bare选项所有的文件,这使得所有的类可用,或者您也可以定义自己的window.MyNamespace = {},并明确地让你类可用,如:

class MyClass 
    ... 

window.MyNamespace.MyClass = MyClass 

您已经标记后requirejs我相信这对于构建你的模块比任何我已经给你的问题,其中每个模块实例被明确地通过了建议的更好的解决方案,但是requirejs是一个完整的话题。

+0

对不起,为此,我删除了requirejs标签。我正在查看requirejs选项。将为此发布一个单独的问题。 – 2013-02-22 18:24:31

我记得100%知道amd是如何工作的,但尽管有MyNamespace--bare编译选项,您可以在使用coffeescript编译器进行编译之前将文件连接成一个“大”文件。

+0

- 我猜不是一个好习惯。我想避免这种情况。 – 2013-02-21 19:51:13

其他答案建议,但你可能不希望与--bare编译,因为它将使所有的顶层声明在文件中是全球性的:不仅是类,但也辅助功能,常数,以及仅在该文件中使用的内容,并且您可能不希望放入全局名称空间。

更好的是明确的,并使用class window.MyClass,这将把表示类放在全局命名空间中。

或者更好的是,如果你有你的应用程序的命名空间,也就是说,在一个文件中声明:

# In another file; make sure the first file gets executed before so `App` exists. 
class App.MyClass 

# Namespace for application stuff. 
window.App = {} 

然后你就可以把班级命名空间简单然后你可以从任何地方通过引用它来包含它的名字空间来实例化和使用这个类:

c = new App.MyClass 
c.someMethod() 
+0

问题是我的类使用main.coffee中声明的应用程序常量。所以我不确定首先加载哪些文件。只有应用程序常量的文件看起来不太好。 – 2013-02-22 18:22:22

+0

@AkshayAurora它看起来像某种循环依赖问题。 JS有这些问题,特别是在考虑文件获取_executed_(毕竟他们是脚本)时。我建议你花点时间清楚地确定依赖关系,然后根据这些依赖关系来布置类/模块。 – epidemian 2013-02-22 21:46:37