2

我对javascript有一个非常奇怪的问题。如果您使用以下代码并运行它,它将运行良好而没有任何错误,但如果您注释第一个alert,它将在第 5 行 ( var _board = Bomber.BoardFactory.getBoard();) 抛出错误,说 BoardFactory 不存在(请记住,第一个警报一切都是运行没有错误)。我已经能够使用 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 运行它,修复了错误(2 缺少分号和缺少 {} 在你的 if)

现在它似乎工作

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()....等,所以它认为您正在调用该函数。

如果您有警报,您将通过自动分号插入保存。

于 2011-01-28T03:17:57.767 回答
-2

很难预测哪个会先执行:(function () {或者$(document).ready(function () {尝试将它们结合起来并在其他任何事情之前声明所有函数

于 2011-01-28T03:17:52.717 回答