Javascript 带有隐藏变量的Coffeescript中的模块模式

Javascript 带有隐藏变量的Coffeescript中的模块模式,javascript,module,design-patterns,coffeescript,Javascript,Module,Design Patterns,Coffeescript,深入研究Coffeescript,我正在尝试将我的Javascript文件移植到Coffeescript 关于这一点,我有一个问题与Doulgas Crockford的模块模式有关(闭包绑定以保持变量“私有”) 因此,我的问题是:以下JS的aquivalent咖啡脚本是什么样子的: var test = function () { var hidden = 'open'; return { open: hidden }; }(); 在Coffeescript中是否有与此模式不同/更好的方法?C

深入研究Coffeescript,我正在尝试将我的Javascript文件移植到Coffeescript

关于这一点,我有一个问题与Doulgas Crockford的模块模式有关(闭包绑定以保持变量“私有”)

因此,我的问题是:以下JS的aquivalent咖啡脚本是什么样子的:

var test = function () { var hidden = 'open'; return { open: hidden }; }();
在Coffeescript中是否有与此模式不同/更好的方法?

Coffeescript(或者更确切地说,
coffee
脚本)会自动将代码包装到匿名函数中,除非您告诉它不要这样做

如果需要从匿名闭包中发布对象,可以显式地将它们分配给根对象;请参见下划线.coffee的开头,以了解一些提示


我认为最好的方法是借助
do
关键字(主要用于捕获循环中的值,请参见我的):

这可编译为

var test;
test = (function() {
  var hidden;
  hidden = 'open';
  return {
    open: hidden
  };
})();

与您的代码相同,但格式不同。(CoffeeScript编译器会自动将所有
var
声明放在其作用域的顶部,这样就可以通过查看JavaScript输出轻松确定变量的作用域。)

我在CoffeeScript wiki中添加了一个关于如何处理名称空间的部分。(我认为)它相当优雅

Coffeescript没有比将所有源代码文件封装在匿名函数中更高的本机模块系统。然而,通过一些简单的技巧,您可以拥有Ruby羡慕的模块。 我定义我的模块如下

@module "foo", ->
    @module "bar", ->
        class @Amazing
            toString: "ain't it"
模块助手的实现是

window.module = (name, fn)->
  if not @[name]?
    this[name] = {}
  if not @[name].module?
    @[name].module = window.module
  fn.apply(this[name], [])
如果愿意,可以将其放入另一个源文件中。然后,您可以通过命名空间模块访问类

x = new foo.bar.Amazing
对于您的具体问题,我认为下面的茉莉花规格使用我的 模块系统

@module "test", ->
  hidden = 10
  @open  = hidden

describe "test", ->
  it "has no hidden", ->
    expect(test.hidden?).toEqual false

  it "has  open", ->
    expect(test.open?).toEqual true

如果您可以在单个类中编写模块,那么使用
-b
选项编译coffeescript将自然创建您正在寻找的模块模式

这:

汇编如下:

var检验;
test=(函数(){
隐藏var;
隐藏='打开';
test.prototype.open=隐藏;
回归试验;
})();

这与您所寻找的非常接近。

“它的存在主要是为了捕获循环中的值”<不同意。
do
的这种特殊行为可以说是最不一致/最令人困惑的特征之一。马特尔,你能解释一下吗?do关键字在我看来像是捕获了本地范围内的值。@matyr当你最初提出它时,它不是
do
的预期目的,但它确实是Jeremy(不情愿地)将它添加到CoffeeScript中的原因。看见它也是在中出现的唯一上下文。
do
。如我在中所述,该功能破坏了一致性(为什么
do(I)->
do f=(I)->
的行为会有所不同?)。事实上,文件记录较少只是另一个缺陷(毕竟这是圣诞节最后一刻的变化)。为什么他们真的要这么做呢。我在今天早些时候的[#960](github.com/jashkenas/coffee script/issues/960)上注意到了这一点。我当然希望Jeremy会选择修复这些不一致的地方,而不是放弃这个功能。
@module "test", ->
  hidden = 10
  @open  = hidden

describe "test", ->
  it "has no hidden", ->
    expect(test.hidden?).toEqual false

  it "has  open", ->
    expect(test.open?).toEqual true
class test
    hidden = 'open'
    open: hidden