3

まず、疑似コードの例:

;(function(foo){

    foo.init = function(baz) { ... }

    foo.other = function() { ... }

    return foo;

}(window.FOO = window.FOO || {}));

次のように呼び出されます。

FOO.init();

私の質問:

  • の技術的な名前/説明は何ですか: window.FOO = window.FOO || {}?

私はコードが何をするかを理解しています...質問する理由については、以下を参照してください。


質問の理由:

渡されたグローバルを次のように呼び出しています。

;(function(foo){
    ... foo vs. FOO, anyone else potentially confused? ...
}(window.FOO = window.FOO || {}));

foo...しかし、グローバルが大文字と呼ばれていることを考えると、小文字の " "と呼ぶのは好きではありませんFOO...混乱しているようです。

このテクニックの技術的な名前を知っていれば、次のように言えます。

;(function(technicalname){
    ... do something with technicalname, not to be confused with FOO ...
}(window.FOO = window.FOO || {}));

彼らがそれを「 」と呼んだ最近の (素晴らしい) 例を見たことがありますexports:

;(function(exports){
    ...
}(window.Lib = window.Lib || {}));

私は自分のコーディング規約を標準化しようとしているだけだと思います... プロが何をし、どのように考えているかを知りたいです (それが私がここで質問している理由です)!

4

4 に答える 4

2

私はいつもそれを「ヌル合体」と理解していました。

IIFE への影響に関してwindow.FOOは、既にインスタンス化されている場合は渡され、インスタンス化されていない場合は空のオブジェクトが渡されます。

次のように読むこともできます。

window.FOO = window.FOO || {};
;(function(foo){

    foo.init = function(baz) { ... }

    foo.other = function() { ... }

    return foo;

}(window.FOO));

個人的には、別のパターンを好みます。

var FOO;
if (!FOO) {
    FOO = {};
}
(function () {
    "use strict";
    FOO.prop1 = 'bar';
    FOO.bar = function (z) {
        return z + 1;
    };
}());

混乱が少なくなり、きれいな名前空間を確保するのに役立ちます。

于 2012-10-08T03:28:28.847 に答える
2

ピートの答えを補完するために、代替フォーム:

;(function() {
  var Foo = window.Foo = window.Foo || {};

  Foo.foo  = 'bar';
  Foo.baz  = function() {
    return "Hello World!";
  };
})();

通常、ローカルvarを使用して、ミニファイヤに数バイトを節約する機会を与えます。これは、 on のように名前空間の深いレベルで作業している場合に、より大きな効果がありますvar MyView = window.MyApp.Views.MyView

于 2012-10-08T03:36:15.680 に答える
1

他の人が指摘したように、最初の質問は完全に別のものであり、2 番目の質問とは独立しています。これらは、2 つのステートメントで行うのではなく、1 つのステートメントで結合することにしたという事実を除いて、互いに何の関係もありません。

最初の質問に対して、Douglas Crockford はこれをデフォルトの割り当てと呼んでいます。同様に、変数が存在する場合はそのままにしておきます。それ以外の場合は、指定されたデフォルト値に初期化します。次のようなものが表示された場合:

foo = foo || {};

あなたの心の目はそれを次のように読むべきです:

foo defaults to `{}`

技術的には、実際には「foo が偽の{}場合は foo に割り当てる」ですが、これを使用する場合、ゼロ、null、未定義な​​どの偽は無効な値であると想定していますfoo。また、この単語はdefaultすでに「foo が定義されていない場合」を意味しています。

しかし、そうは言っても、2 番目の質問を知っていると、IIFE に渡されるパラメーターの名前としてdefaultが実際には適切な単語ではないことは明らかです。そのパラメーターが行っていることは、渡されたオブジェクトにメソッドと属性を添付するだけです。その場合、「これらはオブジェクトのパブリックにエクスポートされたメンバーです」のように、エクスポートが適切です。「これらのものをオブジェクトに取り付ける」のように、アタッチも適切な名前と思います。私の個人的な好みは、単純にobjという名前にすることです。これは、渡されることを期待する型です。

于 2012-10-08T03:59:29.833 に答える