2

慣れていない場合、EMCA6 ドラフトではアロー関数の構文が追加されます。主な違いは次のとおりです。

  • アロー関数にはレキシカルな this があります (したがって、Function.prototype.bindを呼び出したり、クロージャーを作成したりする必要はありません)
  • より短い構文() => "foo"vsfunction(){ return "foo";}
  • アロー関数には .prototype がありません。したがって、それらはコンストラクタとして使用できず、new で呼び出すことはできず、軽量であることを意図しています。

そうは言っても、次の簡単な例を見てみましょう。

var Animal = function(sound) {
    this.sound = sound;
    //arrow notation has lexical this, so this makeNoise must be defined in the constructor
    Animal.prototype.makeNoise = () => this.sound;
};

let dog = new Animal("woof!");
dog.makeNoise(); //woof!

ここでは、通常の関数ではなくアロー関数をメソッドの 1 つとして使用する単純なクラスを作成しています。Animal.prototype.makeNoiseアニマルを初期化するたびにこれが設定されていることは知っていますが、上記には通常と比較して他の欠点がありますか:

var Animal = function(sound) {
    this.sound = sound;
};
Animal.prototype.makeNoise = function() { return this.sound; };

let dog = new Animal("woof!");
dog.makeNoise(); //woof!

これを行うことに危険が潜んでいるかどうかを知りたいと思っています。人々は、新しい短縮された構文をどこでも使用したくなると確信しているためです。前もって感謝します。

4

1 に答える 1

4

これは、Pointy がコメントで述べた理由の 1 つです。Animal のすべてのインスタンスに対して新しいアロー関数オブジェクトを作成しているため、パフォーマンスが悪く、メモリ管理がひどいためです。実際には、関数オブジェクトを複製するよりもさらに悪いことです。その関数の周りに新しいクロージャーも作成するため、アニマル オブジェクトがまだメモリ内にある限り、ガベージ コレクターはコンストラクターのローカル変数を解放できません。

しかし、ECMAScript 6 では、まさにその目的のために、より優れた構文も導入されているためです。

class Animal {
   constructor(sound) {
       this.sound = sound;
   }
   makeNoise() {
       return this.sound;
   }
}
于 2013-09-29T23:40:44.943 に答える