函数在firefox中是未定义的

Dem*_*tic 4 javascript firefox

好的,以下代码在IE7 +和Chrome中运行正常.但由于某种原因,xfade在Firefox中未定义

<html>
    <body>
        <div id="slider"></div>
        <script type="text/javascript">
var Klimateka = {
    Slider: function () {
        // Check if we have a slider div on page
        var slider = document.getElementById('slider');
        if (slider != null) {
            var images = ["slide-image-1.jpg", "slide-image-2.jpg", "slide-image-3.jpg", "slide-image-4.jpg"];
            var i = images.length;
            while (i) {
                i -= 1;
                var img = document.createElement("img");
                img.src = "images/" + images[i];
                slider.appendChild(img);
            }
            var d = document, imgs = new Array(), zInterval = null, current = 0, pause = false;
            imgs = d.getElementById("slider").getElementsByTagName("img");
            for (i = 1; i < imgs.length; i++) imgs[i].xOpacity = 0;
            imgs[0].style.display = "block";
            imgs[0].xOpacity = .99;

            setTimeout("xfade()", 3500);

            function xfade() {
                cOpacity = imgs[current].xOpacity;
                nIndex = imgs[current + 1] ? current + 1 : 0;

                nOpacity = imgs[nIndex].xOpacity;

                cOpacity -= .05;
                nOpacity += .05;

                imgs[nIndex].style.display = "block";
                imgs[current].xOpacity = cOpacity;
                imgs[nIndex].xOpacity = nOpacity;

                setOpacity(imgs[current]);
                setOpacity(imgs[nIndex]);

                if (cOpacity <= 0) {
                    imgs[current].style.display = "none";
                    current = nIndex;
                    setTimeout(xfade, 3500);
                } else {
                    setTimeout(xfade, 50);
                }

                function setOpacity(obj) {
                    if (obj.xOpacity > .99) {
                        obj.xOpacity = .99;
                        return;
                    }
                    obj.style.opacity = obj.xOpacity;
                    obj.style.MozOpacity = obj.xOpacity;
                    obj.style.filter = "alpha(opacity=" + (obj.xOpacity * 100) + ")";
                }
            }
        }
    },

    bar: function () {
    }
}; 

Klimateka.Slider();
Run Code Online (Sandbox Code Playgroud)

我已经设置了一个jsfiddler进行测试:http: //jsfiddle.net/rTtKh/10/

Fel*_*ing 5

这可能仅适用于Firefox:

在子块内声明时,函数不会提升.

xfadeif块中声明,但是你在声明之前调用它:

setTimeout(xfade, 3500);
Run Code Online (Sandbox Code Playgroud)

将函数声明放在最上面.

你必须在setOpacity里面做同样的事情xfade. <- 这不是必要的.

  • @Dementic按照标准,在`if`中有一个`function`语句应该抛出`SyntaxError`异常并停止解析脚本.所有的浏览器都偏离了这里的标准,扩展了JS语法,允许在`if`块中使用这样的`function`语句,但是这些扩展的行为略有不同.如果你坚持编写有效的JavaScript代码,你就不会遇到这些不同行为的问题.... (2认同)