注:class
以下の主な回答は 2012 年に書かれたものです。JavaScript 独自の機能 (ES2015+)に関する追加の注記については、最後を参照してください。
「最高」は本質的に主観的なものですが、それぞれについていくつかの情報を指摘し、「最高」について自分で判断できるようにします。
例 1
Class
...関数のみがアクセスできる真にプライベートなクラス全体の情報(およびユーティリティ関数)を配置できる便利なスコープ(無名関数)を提供します。
var Class = (function(){
var trulyPrivateInformation = 42;
function trulyPrivateUtilityFunction() {
// ...
}
function Class() {
this.test = 'test';
}
return Class;
})();
例 1 は「巻き上げ」ではありません。これは、ステップバイステップ コードの一部として処理されます。
関数にはClass
実名があります。
例 2
...名前のない関数を作成し、名前のある変数に割り当てます。最新のブラウザはそれについてかなり賢いですが、少なくとも理論的には、関数は匿名であり、ツールが提供できる情報に影響を与えます. Class2
IE のような古い環境を除いて、(ES2015 の時点で) 名前は ( ) です。例 1 にあるプライベート クラス全体のスコープはありません。
例 1 と同様に、例 2 は段階的なコードの一部として処理され、巻き上げられません。
例 3
...これは単なる例 1 であり、プライベート クラス全体のスコープはありませんが、「引き上げられた」ものでもあります。Class
関数は、段階的なコードが実行される前に定義されます。つまり、これは機能します:
var c = new Class();
console.log(c.test); // Logs 'test'
function Class() {
this.test = 'test';
}
Class
は下位で定義されていますが、上記のコードが実行される前に実行されることに注意してください。これは、例 1 にも例 2 にも当てはまりません。
例 1 (例 2 ではありません) と同様に、Class
関数には実際の名前があります。
2015 年、JavaScript に独自のclass
構文が追加されました。ここ 2019 年には、最新のすべてのブラウザーでネイティブにサポートされており、IE をサポートする必要がある場合は、Babel などのツールを使用してトランスパイルできます。class
OPの質問にどのように関連するかは次のとおりです。
例 1class
const Class = (() => {
let trulyPrivateInformation = 42;
function trulyPrivateUtilityFunction() {
// ...
}
return class Class {
constructor() {
this.test = 'test';
}
}
})();
コードの段階的な実行で処理されます。真にプライベートなもののための真にプライベートなスコープ (匿名スコープ関数内) を持っています。固有名詞あり。
を使用した例 2 class
(これは を使用した例 3 でもありますclass
)
class Class2 {
constructor() {
this.test = 'test';
}
}
let c2 = new Class2();
console.log(typeof Class2);
console.log(c2.test);
コードの段階的な実行で処理されます。例 1 にある真のプライベート スコープはありません (ただし、プライベート フィールドとメソッドは近日公開予定です)。固有名詞あり。