JavaScript中奇怪的算术行为

时间:2012-05-28 22:15:24

标签: javascript

我正在尝试用JavaScript编写自己的幻灯片。我已经拥有的是一个可以在Opera,Safari和Chrome中运行的骨架:

var slideShow = (function() {
    var latestGames = document.getElementById('latestGames').getElementsByTagName('li');
    var displayedGame = 0;
    return {
        init: function() {
            latestGames[displayedGame].style.display = 'inline';
            setInterval(this.update, 3000);
        },
        update: function(gameToDisplay) {
            console.log("Displayed game: " + displayedGame);
            latestGames[displayedGame].style.display = 'none';
            gameToDisplay = gameToDisplay || (displayedGame === (latestGames.length - 1) ? 0 : ++displayedGame);
            console.log("Game to display: " + gameToDisplay);
            console.log('====================');
            latestGames[gameToDisplay].style.display = 'inline';
            displayedGame = (gameToDisplay == latestGames.length ? 0 : gameToDisplay);
        }
    }
})();

但在Firefox中,我只记录gameToDisplay变量时得到随机数。我看不出错误在哪里。

事先谢谢。

3 个答案:

答案 0 :(得分:4)

Firefox(13之前版本)将参数传递给您的间隔处理程序。该参数给出了函数调用的“迟到”;换句话说,应该被调用的毫秒数。

请参阅黄色警告here

  

注意:在Gecko 13之前(Firefox 13.0 / Thunderbird 13.0),Gecko   将一个额外的参数传递给回调例程,指示   超时的“实际延迟”,以毫秒为单位。这不规范   不再提供参数。

答案 1 :(得分:4)

使用以下代码:

var self = this; // preserve this to be used inside the callback
setInterval(function() { self.update(); }, 3000)

通常你所做的会有效,但有些(Gecko-based)浏览器会将参数传递给定时器回调函数。

答案 2 :(得分:0)

setInterval每3秒调用一次.update。 update会有一个对象的引用(this),但是我看不到它会如何在gameToDisplay中传递。

删除gameToDisplay,因为它看起来是多余的,或者将其设置为displayGame之类的实例变量,并将其设置为独立于update()。

在大多数情况下,它将为null,但Firefox显然会传递某种参数。