Javascript 为什么注释掉这段代码的alert()行会导致失败?

Javascript 为什么注释掉这段代码的alert()行会导致失败?,javascript,jquery,closures,hoisting,Javascript,Jquery,Closures,Hoisting,我对javascript有一个非常奇怪的问题。如果您获取以下代码并运行它,它将正常运行,不会出现任何错误,但是如果您对第一个警报进行注释,它将在第5行(var\u board=Bomber.BoardFactory.getBoard();)抛出一个错误,说明BoardFactory不存在(请记住,在第一个警报中,所有操作都没有错误)。我已经能够在Firefox和Chrome上重现这种精确的行为 Bomber = {}; Bomber.Game = function () { var s

我对javascript有一个非常奇怪的问题。如果您获取以下代码并运行它,它将正常运行,不会出现任何错误,但是如果您对第一个
警报进行注释,它将在第5行(
var\u 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();
});

我的问题是,是什么可能导致这种奇怪的行为?警报调用究竟有多大可能使它识别出轰炸机。BoardFactory

很难预测哪一个将首先执行:
(函数(){
$(文档)。就绪(函数(){
尝试组合这些函数,并在其他任何函数之前声明所有函数

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


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

否,则立即执行的函数将始终首先执行。在这种情况下,当调用Bomber.Game()时,Bomber.BoardFactory没有定义,这是因为在$(文档)中没有调用Bomber.Game().ready handler,它立即发生了,因为OP留下了一个分号。对,我现在记得混淆了$(document)。ready(函数(){和函数pageLoad(){不要误认为是自执行函数,sry关于这一点,我的mistake@HoLyVieR只有第一次看到它:-)除了必要的地方,我不使用分号——但是,对于以
)开头的表达式(或者很少使用
[
,但也有
+
-
),我总是在它们前面加上
,例如:
;(function(){…})()
.JavaScript确实使用ASI,但如果可以继续上一个表达式,它就不会放在分号中。由于
..}\nalert(…
不是有效的表达式,所以JavaScript将其读作
..};alert(…
.Happy coding.@pst分号插入到结束}之间函数,以及以
警报
开头的行(据我所知)@david Yeah,我读错了——删除了注释:)回答得好。@pst将分号放进去总是比试图玩系统游戏更安全。如果您担心大小,请通过优化程序/编译器运行它,它会删除您不需要的分号。@pst真的吗?为什么要冒一个随机错误的风险?我把它放在任何需要的地方,以防万一。我不相信分号插入。