3

私はより多くのオープンソースの JavaScript フレームワークを読んでおり、匿名関数を作成する方法をさらに見つけましたが、何が異なり、最良の方法は何ですか?

(function() {
    this.Lib = {};
}).call(this);

(function() {
    var Lib = {}; window.Lib = Lib;
})();

(function(global) {
    var Lib = {}; global.Lib = Lib;
})(global);
4

3 に答える 3

3
(function() {
    this.Lib = {};
}).call(this);

呼び出されるオブジェクトのプロパティを定義し、Libすぐに呼び出されます。this通常はwindow. 代わりに、それが呼び出されたメソッドを所有するオブジェクトを参照する場合があります。

(function() {
    var Lib = {}; window.Lib = Lib;
})();

Lib呼び出された場所に関係なく のプロパティを定義しますwindow(ただし、すぐに呼び出されます)。

(function(global) {
    var Lib = {}; global.Lib = Lib;
})(global);

Lib関数に渡されるオブジェクトのプロパティを定義します。すぐに呼び出されますがglobal、現在のスコープで値を定義していない限り、エラーが発生します。windowまたはいくつかの名前空間オブジェクトをそれに渡すことができます。


これらは実際には「無名関数」を定義する異なる方法ではなく、すべて標準的な方法を使用しています。これらは、グローバル (または事実上グローバル) プロパティに値を割り当てるさまざまな方法です。この意味で、それらは基本的に同等です。

より重要なのは、たとえば、オブジェクトが返す/構築/公開するオブジェクトのメソッドとプロパティをどのように定義するか (つまり、それらLib自体をどのように構築するか) です。

これらの関数はすべて戻りundefinedますが、最初の関数だけが ( を使用して) コンストラクターとして有効に適用できるnewため、フレームワークのイニシャライザーに過ぎないように見えます。

于 2012-05-13T22:06:04.117 に答える
1

それらはすべて、実質的に次のものと同等です(ただし、効率が低く、わかりにくい)。

var Lib = {};

即時呼び出し関数式(IIFE)は、より広く利用可能である必要がなく、条件付きでオブジェクトとメソッドを作成する必要のない変数のスコープを制限するのに便利ですが、使いすぎる可能性があります。

最後の例では、次のことを意味していることに注意してください。

(function(global) {
  ...
})(this);
于 2012-05-13T22:35:58.033 に答える
0

この質問を確認してください:同じ行で無名関数を呼び出す必要があるのはなぜですか?

無名関数に関する多くの情報が含まれています。この質問もチェックしてください: var functionName = function() {} vs function functionName() {}

于 2012-05-13T22:00:46.167 に答える