Javascript JQuery函数的最佳实践

时间:2011-09-19 11:36:53

标签: javascript jquery jshint

我正在尝试github而且我会在那里放一个小测试项目。因为它是公开的我通过JSHint运行但我得到一个我无法动摇的错误:

Line 21 preloadImages();

'preloadImages' is not defined.

这是代码:

$(function() {

    var allImagesLoaded = false, imagesLength = 0, counter = 0, imageArray = [], loadedImages = [], loadedImagesCounter = 0;

    /*--------------------------------
    Add your images to the array
    and your good to go
    --------------------------------*/
    imageArray = ["img/1.jpg", "img/2.jpg", "img/3.jpg", "img/4.jpg"];
    imagesLength = imageArray.length;

    if(imagesLength === 0) {
        $('#container').html('<p><strong>You need to put some images in your array</strong></p>');
    }
    else {

        preloadImages();
    }

    function preloadImages() {
        var tempImage = $("<img />").attr("src", imageArray[loadedImagesCounter]);

        tempImage.load(function(){

            loadedImages.push(this);
            loadedImagesCounter++;
            if(loadedImagesCounter == imagesLength) {
                imageArray = loadedImages;
                initEverything();
            }
            else {
                if(!allImagesLoaded)
                {
                    preloadImages();
                }
            }       
        });
    }

    function initEverything() {


        allImagesLoaded = true;
        $('#preloadingImages').hide();

        // Deactivate the context menu that appears on right click
        $(document).bind("contextmenu", function(e) {
            return false;
        });

        var theSource = $(imageArray[0]).attr('src');

        var theImage = $('<img />');
        $(theImage)
            .attr('src', theSource)
            .attr('width', imageArray[0].width)
            .attr('height', imageArray[0].height)
            .attr('alt', 'demobild 1')
            .attr('id', 'pageImage');

        $('#container').append(theImage)

        $("#pageImage").mousedown(function(e) {
            if (allImagesLoaded) {
                switch (e.which) {
                    case 1:
                        stepForward();
                        break;
                    case 2:
                        // center button on the mouse
                        break;
                    case 3:
                        stepBackward();
                        break;
                    default:
                        // Nada
                }
            }
        });
        $(document).keydown(function(e) {
            e.preventDefault();
            if (allImagesLoaded) {
                switch (e.keyCode) {
                    case 37: // Left
                        stepBackward();
                        break;
                    case 38: // Up
                        stepBackward();
                        break;
                    case 39: // Right
                        stepForward();
                        break;
                    case 40: // Down
                        stepForward();
                        break;
                    default:
                        // Nada
                }
            }
        });

    }

    function stepForward() {

        if (counter === imagesLength-1) {
            counter = 0;
        } else {
            counter++;
        }
        $("#pageImage").attr("src", $(loadedImages[counter]).attr('src'));
        $("#pageImage").attr("alt", "demobild " + counter);
    }

    function stepBackward() {

        if (counter === 0) {
            counter = imagesLength-1;
        } else {
            counter--;
        }
        var sourcePath = $(imageArray[counter]).attr('src');
        $("#pageImage").attr("src", sourcePath);
        $("#pageImage").attr("alt", "demobild " + counter);
    }

});

放置功能的最佳做法是什么?在顶部?

这是我的项目 https://github.com/Benjaminsson/Image-expo

3 个答案:

答案 0 :(得分:1)

JavaScript将函数声明提升到作用域的开头。因此,无论在何处定义,该函数都可在整个范围内使用(传递给$()的函数)。 JSLint可能无法正确检测到这一点,并在您调用它时将该函数视为未定义。

答案 1 :(得分:1)

您的代码有效,因为JavaScript运行时将在代码执行之前首先提升所有命名函数

alert(typeof(preloadImages)); // "function
function preloadImages() {
    // your code
}

最佳做法会将所有命名函数放在执行范围的顶部;在你的情况下,它位于第一行之后:$(function() {

这是为了避免任何可能的混淆。

http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

了解详情

答案 2 :(得分:0)

有些人认为将所有函数定义和变量声明放在其作用域的顶部(即函数的开头)是个好主意。这是因为无论代码在哪里,Javascript解释器都会这样做,如果您的代码尽可能接近解释器对它的理解,它有助于避免混淆错误。

这是一种风格选择;你可以自由地忽略它。使用JSHint,您可以取消选择“要求在使用前声明变量”选项,并且您的代码将通过。

(好吧,当你纠正JSHint报告的其他错误时它会发生!)