0

これらの JavaScript 初期化のどれ (もしあれば) を使用するかについて少し混乱しています。私が知る限り、それらはすべて同じことを行います。どちらか一方を使用する必要がある場合はありますか? Mt プロジェクトでは、複数の関数と名前空間を 1 つのオブジェクトにカプセル化する必要があるため、変数名でグローバル スコープが乱雑になることはありません。+function(){}(); および (関数())();

どんな助けでも大歓迎です。最終的な目標は、すべての関数を単一の名前空間にカプセル化することです。IE MyCompany.function、MyCompany.Namepsace.Function ...

<script>
    var Ford = {};
    +function() {
        Ford.start = function() {
            console.log("Ford just started");
        };
    }();
    Ford.start();
</script>

<script>
    var Honda = {};
    (function() {
        Honda.start = function() {
            console.log("Honda just srtarted");
        };
    })();
    Honda.start();
</script>

<script>
    var Toyota = function() {
        return {
            start: function() {
                console.log("Toyota just strted");
            }
        };
    }
    var car = new Toyota();
    car.start();
</script>
4

2 に答える 2

2

newJavascript 関数は、キーワードが使用されている場合にのみコンストラクターとして呼び出されます。new新しいオブジェクト インスタンスを作成し、コンストラクタのプロトタイプから継承し、thisキーワードのコンテキストを新しく作成されたオブジェクト インスタンスにします。したがって、プロトタイプを使用してプロパティを継承したりthis、コンストラクタで新しいプロパティを作成するためにキーワードを使用したりしない場合は、実際にはコンストラクタを使用する必要はありません。

あなたが探しているのは、すぐに呼び出される関数を使用して実装されるモジュール パターンだと思います。最初の 2 つの例はどちらも、すぐに呼び出される関数を使用しています。スタイルは よりも好ましいと思います。周囲と原因の両方により、javascript パーサーは関数宣言ではなく関数式を期待し、これにより末尾が関数を呼び出すことができます。多少読みにくくなるだけでなく、関数の戻り値も変更される可能性があります。(function(){}());+function(){}();()+()+

これにいくつかのバリエーションが必要だと思います(リンクからコピー):

var MODULE = (function () {   
    var module = {};
    var privateVariable = 1;

    function privateMethod() {
        // ...
    }

    module.moduleProperty = 1;
    module.moduleMethod = function () {
        // ...
    };

    return module;
}());
于 2013-02-06T23:37:26.987 に答える
1

それはすべて有効なJSですが、JSがどのように機能するかを理解していない可能性があると私に信じさせるような仮定をしているのです。最初の2つの例は、通常の意味でのコンストラクターではありません...それらは一種のモジュールパターンですが、そうではありません。あなたはそれを凝縮することができます

var Honda = {}; 
Honda.start = function() { console.log("Honda just started"); }

自己実行機能を忘れてください。static上に表示されているものは、他の言語の関数として考えているものと似ています。

public class Honda {
    public static void start() { Console.WriteLine("Honda Just Started"); }
}

インスタンス関数が必要な場合は、プロトタイプまたはthisコンストラクターのキーワードにアタッチする必要があります。

プロトタイプ:

var Honda = function() {}
Honda.prototype.start = function() { console.log("Honda just started"); }

これ:

var Honda = function() {
    this.start = function(){
        console.log("Honda just started");
    }
}

トヨタでの最後の例は、関数コンストラクターがどのように機能するかについて根本的な誤解があることを示しています。オブジェクトが破棄され、その見返りに、次のように記述された可能性のあるオブジェクトリテラルが取得されます。

var Toyota = {
    start: function(){
        console.log("Toyota just started");
    }
}

あなたが(おそらく)意図しているのは、上記のホンダの例で説明した「この」パターンです。

var Toyota = function() {
    this.start = function() {
        console.log("Toyota just started");
    }
}

最後に、関数の「名前空間」ライブラリを作成する場合、モジュールパターンが親友になる可能性があります。これにより、正式なコンストラクター/プロトタイプなどを必要とせずにプライベート状態を維持できます。

var MyCompany = {};

//car module
(function(ns){
    var module,
        _isStarted;

    function start() { console.log('start'); _isStarted = true; }
    function stop() { console.log('stop'); _isStarted = false; }
    function isStarted() { return _isStarted; }

    module = {
        start: start,
        stop: stop,
        isStarted: isStarted
    }

    ns.CarModule = module;
}(MyCompany));

//use:
MyCompany.CarModule.start();
if(MyCompany.CarModule.isStarted()) { MyCompany.CarModule.stop(); }
于 2013-02-06T22:42:22.160 に答える