为什么我的计算结果有时未定义?

时间:2015-07-31 08:52:10

标签: javascript

所以我尝试用随机图像旋转创建我自己的幻灯片。 有时,随机数计算的结果是未定义的。

$(document).ready(function () {

    var slide = 2;  
    var si_array1 = [1, 2, 3];
    var si_nindex1 = 0;
    var si_index1 = 0;
    var si_array2 = [1, 2, 3];
    var si_nindex2 = 0;
    var si_index2 = 0;

    initSlider();
    function initSlider() {

        setupSlider();      
        function setupSlider() {

            if(slide === 1) {
                si_nindex1 = Math.floor(Math.random() * 10) % si_array1.length;
                si_index1 = (si_nindex1 === si_index1) ? si_nindex1 -1 : si_nindex1;
                updateSlider('#sl-one', 'sl-one', si_array1[si_index1]);        
            } else if(slide === 2) {
                si_nindex2 = Math.floor(Math.random() * 10) % si_array2.length;
                si_index2 = (si_nindex2 === si_index2) ? si_nindex2 -1 : si_nindex2;
                updateSlider('#sl-two', 'sl-two', si_array2[si_index2]);
            }

        }

        function updateNumber() {

            if(slide === 1) {
                slide = 2;                          
            } else if(slide === 2) {
                slide = 1;
            }   
            setTimeout(initSlider, 5000);

        }

        function updateSlider(sliderid, slider, img_nr) {

            $(sliderid).css('backgroundImage', 'url(/img/slides/' + slider + '/slide' + img_nr + '.jpg)');
            updateNumber();

        }

    }

});

为什么会发生这种情况,我该如何解决? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

我希望它不是未定义的随机数计算,而是结果:

si_array1[si_index1]

你在哪里:

si_nindex1 = Math.floor(Math.random() * 10) % si_array1.length;
si_index1 = (si_nindex1 === si_index1) ? si_nindex1 -1 : si_nindex1;

然后如果 si_nindex1 si_index1 都为0,则 si_index1 将设置为-1并且:

si_array1[si_index1]

将返回 undefined

答案 1 :(得分:0)

这不是未定义的随机数计算,而是si_array1[si_index1]。当si_nindex1在第一个循环中等于0时,您将si_index1设置为-1,因此您尝试访问不存在的si_array1[-1]

您可以略微修改代码以避免此问题,例如添加以下行:

si_index1 = (si_index1 < 0) ? si_index1 + 2 : si_index1;

所以你的代码变成了:

$(document).ready(function () {
var slide = 2;  
var si_array1 = [1, 2, 3];
var si_nindex1 = 0;
var si_index1 = 0;
var si_array2 = [1, 2, 3];
var si_nindex2 = 0;
var si_index2 = 0;

initSlider();
function initSlider() {

    setupSlider();      
    function setupSlider() {

        if(slide === 1) {
            si_nindex1 = Math.floor(Math.random() * 10) % si_array1.length;
            si_index1 = (si_nindex1 === si_index1) ? si_nindex1 -1 : si_nindex1;

            si_index1 = (si_index1 < 0) ? si_index1 + 2 : si_index1; //Code added

            updateSlider('#sl-one', 'sl-one', si_array1[si_index1]);        
        } else if(slide === 2) {
            si_nindex2 = Math.floor(Math.random() * 10) % si_array2.length;
            si_index2 = (si_nindex2 === si_index2) ? si_nindex2 -1 : si_nindex2;

            si_index2 = (si_index2 < 0) ? si_index2 + 2 : si_index2; //Code added

            updateSlider('#sl-two', 'sl-two', si_array2[si_index2]);
        }

    }

    function updateNumber() {

        if(slide === 1) {
            slide = 2;                          
        } else if(slide === 2) {
            slide = 1;
        }   
        setTimeout(initSlider, 5000);

    }

    function updateSlider(sliderid, slider, img_nr) {

        $(sliderid).css('backgroundImage', 'url(/img/slides/' + slider + '/slide' + img_nr + '.jpg)');
        updateNumber();

    }

}

});