gpt4 book ai didi

javascript - jQuery、悬停方法和闭包

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:06:28 25 4
gpt4 key购买 nike

一段时间以来,我一直在努力解决 Javascript 闭包问题,试图让大脑围绕函数范围进行思考,但我认为它们反而围绕着我。我看过很多帖子(Nyman 的帖子最有帮助),但显然还是不明白。试图在 jQuery 中的悬停方法上运行循环。需要悬停功能来最终触发多个 Action ,但现在很乐意让它们使用单​​个图像交换。

$(document).ready(function() {

imageSource = [];
imageSource[0] = 'images/img0.png' //load 0 position with "empty" png
imgArea = [];

for (var i=1; i<11; i++) {

(function( ){ //anonymous function for scope

imageSource[i] = 'images/img' + i + '.png';
imgArea[i] = '#areamap_Img' + i;

// running console.log here gives expected values for both

$(imgArea[i]).hover( //imgArea[i] (selector) works correctly here

function() {
$('#imgSwap').attr('src',imageSource[i]); // imageSource[i] is undefined here
},
function() {
$('#imgSwap').attr('src','images/img0.png');
});

})(); // end anonymous function and execute

}; // for loop

});

从另一篇 jQuery 文章中尝试了使用匿名函数来确定范围的想法。似乎工作正常,但在第一个悬停函数中为数组值抛出未定义,我猜是因为它是一个内部函数(硬编码图像源在那里正常工作)。

最佳答案

你的闭包确实有问题,这与你对 var i 的使用有关。由于您的匿名函数没有 i 的本地版本,因此它使用的是其上方函数的版本。但是,当它稍后尝试访问 i 时,i == 11(因为这就是循环终止的原因)。要解决此问题,您需要在每个匿名函数中声明 i 的本地版本,如下所示:

for (var i=1; i<11; i++) {

(function( ){ //anonymous function for scope
var index = i; // The important part!

// It's not technically necessary to use 'index' here, but for good measure...
imageSource[index] = 'images/img' + index + '.png';
imgArea[index] = '#areamap_Img' + index;

$(imgArea[index]).hover(

function() {
$('#imgSwap').attr('src',imageSource[index]); // Here's where `index` is necesssary.
},
function() {
$('#imgSwap').attr('src','images/img0.png');
});

})(); // end anonymous function and execute

}; // for loop

此外,您的代码中有一个小问题,您应该修复它以备不时之需。您没有正确访问局部变量;你应该使用:

var imageSource = []; 
var imageSource[0] = 'images/img0.png' //load 0 position with "empty" png
var imgArea = []

没有“var”,您就是在声明和访问全局变量。 (如果这是您的预期行为,那么我深表歉意。)

关于javascript - jQuery、悬停方法和闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/848088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com