为什么coffeescript会生成这样的类?

rye*_*guy 7 javascript coffeescript

鉴于以下coffeescript代码:

class Animal
  constructor: (@name) ->
  speak: (things) -> "My name is #{@name} and I like #{things}"
Run Code Online (Sandbox Code Playgroud)

这是生成的:

var Animal = (function() {
  function Animal(name) {
    this.name = name;
  }
  Animal.prototype.speak = function(things) {
    return "My name is " + this.name + " and I like " + things;
  };
  return Animal;
})();
Run Code Online (Sandbox Code Playgroud)

但为什么不是这个更惯用的代码生成?

var Animal = function Animal(name) {
  this.name = name;
};
Animal.prototype.speak = function(things) {
  return "My name is " + this.name + " and I like " + things;
};
Run Code Online (Sandbox Code Playgroud)

我知道coffeescript在匿名函数中包含很多东西来控制范围泄漏,但是这里可能会泄漏什么?

jas*_*nas 12

生成的代码可以在Internet Explorer中可靠地具有命名功能.(在本例中,"Animal".)如果您只是在顶级作用域中使用命名函数,它将与var Animal =可能存在的任何声明冲突...即使在较低的作用域中,也会阻止它们被正确引用.要解决IE错误,我们在类定义中包含函数包装器.

  • "名称冲突"并不是关注的问题(无论如何,你正在做`var Animal =`).问题是你永远不应该为JScript命名函数_expressions_.更多关于"IE bug":http://kangax.github.com/nfe/ (5认同)