为什么CoffeeScript在闭包中包装类定义?

Dav*_*son 8 javascript minify coffeescript

在CoffeeScript中,这个:

class Foo
  method: (x) ->
    x+1
Run Code Online (Sandbox Code Playgroud)

编译为:

// Generated By CoffeeScript
Foo = (function() {
  function Foo() {}
  Foo.prototype.method = function(x) {
    return x+1;
  }
  return Foo;
})()
Run Code Online (Sandbox Code Playgroud)

这似乎有点过分.以下内容应在功能上相同:

// Generated by Dave
function Foo() {}
Foo.prototype.method = function(x) {
    return x+1;
}
Run Code Online (Sandbox Code Playgroud)

额外的"封闭"包装的动机是什么?

这不仅仅是造型的空闲问题; 它对整体代码大小有影响.

Coffee版本缩小为84个字节:

Foo=function(){function e(){}return e.prototype.method=function(e){return e+1},e}();
Run Code Online (Sandbox Code Playgroud)

我的版本缩小为只有61个字节:

function Foo(){}Foo.prototype.method=function(e){return e+1};
Run Code Online (Sandbox Code Playgroud)

23个字节是愚蠢的无关紧要,但在一个有很多类的项目中,开销加起来.

好吧,我在下面写了一个答案,驳斥了字节大小理论......对于任何合理的类,Coffee方法都会变小.

可能还有其他原因.帮我想一想.

epi*_*ian 8

使用闭包包装类定义的另一个原因是为该代码提供一个新的词法范围,用于声明仅在类中可见的变量和内容:

class AwesomeThing
  # You might have private "methods" here.
  doSomethingAwesome = (what) ->
    console.log "I'm doing #{what} like a pro!"
  # Or run any arbitrary code.
  for i in [1..10]
    @prototype["uselessMethod#{i}"] = -> 'nothing'

  beAwesome: ->
    doSomethingAwesome @uselessMethod5() # The 5'th useless method is the best.
Run Code Online (Sandbox Code Playgroud)

在代码中,变量doSomethingAwesomei局部于类定义,从而使他们的"私人"外部用户.

如果不需要局部变量,CoffeeScript编译器可以删除额外的包装IMO.但是从实现的角度看,总是包装类定义可能更简单:)


Nev*_*vir 2

Jeremy 在一个相关问题中回答了这个问题- 看起来主要目的是避免触发 IE bug。