我正在尝试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);
}
});
放置功能的最佳做法是什么?在顶部?
答案 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报告的其他错误时它会发生!)