2

私はjavascriptで非常に奇妙な問題を抱えています。次のコードを取得して実行すると、エラーなしで正常に実行されますが、最初の をコメントすると、5 行目 ( ) で BoardFactory が存在しないというalertエラーがスローされます(最初のアラートではすべてがvar _board = Bomber.BoardFactory.getBoard();エラーなしで実行されます)。この正確な動作を Firefox と Chrome で再現できました。

Bomber = {};

Bomber.Game = function () {
    var self = {};
    var _board = Bomber.BoardFactory.getBoard();

    self.init = function () {};
    self.start = function () {};

    return self;
}

alert("2");

(function () {
    var instance;

    Bomber.BoardFactory = {};
    Bomber.BoardFactory.getBoard = function () {
        if (!instance)
            instance = new Bomber.Board();
        return instance;
    };
})();

alert("3");

Bomber.Board = function () {
    var self = {};
    return self;
}

$(document).ready(function () {
    var game = Bomber.Game();
    game.init();
    game.start();
});

私の質問は、何がこの奇妙な動作を引き起こす可能性があるのですか? 一体どのようにして、アラート呼び出しで を認識させることができるのBomber.BoardFactoryでしょうか?

4

2 に答える 2

6

私はそれをjslintで実行し、エラーを修正しました(ifに2つのセミコロンと{}がありません)

今ではうまくいくようです

Bomber = {};

Bomber.Game = function () {
    var self = {};
    var _board = Bomber.BoardFactory.getBoard();

    self.init = function () {};
    self.start = function () {};

    return self;
};

//alert("2");

(function () {
    var instance;

    Bomber.BoardFactory = {};
    Bomber.BoardFactory.getBoard = function () {
        if (!instance){
            instance = new Bomber.Board();
        }
        return instance;
    };
})();

//alert("3");

Bomber.Board = function () {
    var self = {};
    return self;
};

$(document).ready(function () {
    var game = Bomber.Game();
    game.init();
    game.start();
});

何が起こっているのかというと、 を定義した後に最後のセミコロンがないBomber.Gameため、次は (function()....etc であり、関数を呼び出していると見なされます。

そこにアラートがある場合は、自動セミコロン挿入によって保存されます。

于 2011-01-28T03:17:57.767 に答える
-2

どちらが最初に実行されるかを予測するのは困難です:(function () {または、$(document).ready(function () {それらを組み合わせて、何よりも先にすべての関数を宣言しようとします

于 2011-01-28T03:17:52.717 に答える