7

次の coffeescript コードが与えられた場合:

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

これが生成されます:

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;
})();

しかし、なぜこの慣用的なコードが生成されないのでしょうか?

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

スコープ リークを制御するために、coffeescript が無名関数に多くのものをラップしていることは知っていますが、ここで何がリークする可能性があるのでしょうか?

4

3 に答える 3

12

生成されたコードにより、Internet Explorer で名前付き関数を確実に使用できるようになります。(この場合は「アニマル」。) 名前付き関数をトップレベル スコープで単純に使用すると、var Animal =存在する可能性のある宣言と競合し、下位スコープであっても、それらが正しく参照されなくなります。IE のバグを回避するために、クラス定義の周りに関数ラッパーを含めます。

于 2011-01-12T17:51:54.747 に答える
2

これは、例外がスローされたときの関数名だけでなく、クラス名を含むバックトレースをサポートするためです。

于 2011-01-12T16:34:12.743 に答える