这个JavaScript模式有什么用?

Šim*_*das 27 javascript coffeescript

我看到了这种模式:

Money = (function() {
    function Money(rawString) {
        this.cents = this.parseCents(rawString);
    }
});
Run Code Online (Sandbox Code Playgroud)

在这个CoffeeScript截屏预览中.(截屏视频的主页在这里.)

现在,我不明白这种模式.有一个Money包含Money函数的函数.那是什么意思?

有人能解释一下吗

T.J*_*der 17

如上所述,除了Money可以从window对象中删除外部符号之外没有任何意义(除了在IE7及以下,但这是另一个故事),因为它是一个正常(隐含)属性window(与一个var或一个符号相对)源自函数声明).但即使这样,外部Money符号也会收到一个绝对没有任何功能的功能.可能是错误引用的吗?

例如,这是一个相当标准的模式:

Money = (function() {
    var someCompletelyPrivateVariable;

    function doSomethingCompletelyPrivate() {
    }

    function Money(rawString) {
        this.cents = this.parseCents(rawString);
    }

    return Money;
})();
Run Code Online (Sandbox Code Playgroud)

这是模块模式,它允许您拥有完全私有的变量和函数(两者都说明),同时只有一个公共符号.但是我必须编辑一点点才能创建它(最重要的编辑是return Money;最后的编辑和()匿名函数之后的添加,所以我们调用它而不是仅仅定义它.

  • @RobG:我添加了一个返回的东西不是构造函数,它是一个范围函数.它的目的纯粹是为了制作私人范围.它返回一个*可能*是构造函数的函数.没有更多的范围,我们无法知道. (3认同)

Rig*_*red 15

使用视频声称的CoffeeScript代码是正确的转换...

class Money
    constructor: (rawString) ->
        @cents = @parseCents rawString
Run Code Online (Sandbox Code Playgroud)

... CoffeeScript将生成以下内容,这与@TJ Crowder的答案基本相同:

var Money;
Money = (function() {
  function Money(rawString) {
    this.cents = this.parseCents(rawString);
  }
  return Money;
})();
Run Code Online (Sandbox Code Playgroud)

我只是发布这个来展示CoffeeScript 实际上做了什么,而且视频并不代表现实.

如果您访问该网站并单击"Try CoffeeScript"按钮,则可以看到转换.

请不要 "接受"这个答案.


编辑:

要添加一些使用范围的私有变量用法,您可以这样做:

class Money
    priv=0
    constructor: (rawString) ->
        @cents = @parseCents rawString
        @id = priv++
Run Code Online (Sandbox Code Playgroud)

......呈现为:

var Money;
Money = (function() {
  var priv;
  priv = 0;
  function Money(rawString) {
    this.cents = this.parseCents(rawString);
    this.id = priv++;
  }
  return Money;
})();
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我对CoffeeScript一无所知.它的语法让我感到困惑,但也许只是因为我不习惯它.

我喜欢JavaScript的方式(特别是新的和未来的变化).