为什么注释掉这段代码的alert()行会使它失败?

时间:2011-01-28 03:12:24

标签: javascript jquery closures hoisting

我对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

2 个答案:

答案 0 :(得分: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()....等等,所以它认为你正在调用这个函数。

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

答案 1 :(得分:-2)

很难预测哪一个会首先执行:(function () {$(document).ready(function () {尝试将这些组合起来并在其他任何事情之前声明所有功能