HoL*_*ieR 2 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();
});
Run Code Online (Sandbox Code Playgroud)
我的问题是,什么可能导致这种奇怪的行为?一个警报呼叫怎么可能识别它Bomber.BoardFactory?
我通过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();
});
Run Code Online (Sandbox Code Playgroud)
发生的事情是你在定义之后错过了最后一个分号Bomber.Game,所以下一个是(function()....等等,所以它认为你正在调用这个函数.
如果您有警报,则通过自动分号插入保存.
| 归档时间: |
|
| 查看次数: |
1236 次 |
| 最近记录: |