素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

ES6のclassは巻き上げがされない

ちょっとハマったのでメモ。 例えば

alert(A);

function A() {
}

はできるが、

alert(A);
class A {

}

ができないのはなぜか。

class A {
}

class B extends A {

}

例えば、このようなコードの場合、hoisting(スコープ先端への巻き上げ)をしても問題ないが、 関数と違ってextendsはその場で評価しなければいけないことがある。 例えば、

var A = function () {

};
A.prototype.x = function () {
  return 1;
};

class B extends A {
}

alert(new B().x());

というコードの場合、BクラスはAを継承しなければいけないので、var Aで宣言されているものはhoistingされないのでclass宣言もその場で評価しないと、正常に継承することができない。

というわけで、

function A () {
}

class A {
}

は評価の順序が違い、class Aはvar A =とおなじような順序で評価されるわけである。