如果intervalIsClear为true,则hoveredItemIndex正在拾取LI元素的索引。
如果intervalIsClear为false,则在setTimeout()内声明hoveredItemIndex,但返回-1。为什么一旦它被包装在setTimeout()中就找不到索引?
function()
{
if (intervalIsClear == true){
hoveredItemIndex = $('.menu li').index(this);
changeToHoverText();
} else {
hello = setTimeout(function(){
hoveredItemIndex = $('.menu li').index(this);
alert (hoveredItemIndex);
changeToHoverText();
},500);
}
}
答案 0 :(得分:4)
因为setTimeout
函数中的执行上下文已更改。请记住,在javascript中,this
关键字是函数执行的上下文。在您的情况下,this
对象是window
对象。
var self = this;
if (intervalIsClear == true){
hoveredItemIndex = $('.menu li').index(this);
changeToHoverText();
} else {
hello = setTimeout(function(){
hoveredItemIndex = $('.menu li').index(self);
alert (hoveredItemIndex);
changeToHoverText();
},500);
}
因此,如上所述调用setTimeout()
,您实际上正在执行此操作window.setTimeout()
。
答案 1 :(得分:4)
这是因为当执行函数时,setTimeout
的回调会改变方法的执行上下文。这意味着this
回调内外的setTimeout
变量指向不同的对象。
使用$.proxy手动分配回调方法的执行上下文
function () {
if (intervalIsClear == true) {
hoveredItemIndex = $('.menu li').index(this);
changeToHoverText();
} else {
hello = setTimeout($.proxy(function() {
hoveredItemIndex = $('.menu li').index(this);
alert(hoveredItemIndex);
changeToHoverText();
}, this), 500);
}
}
答案 2 :(得分:2)
this
回调中的 setTimeout
与外部不一样。
您需要:
var that = this;
hello = setTimeout(function(){
hoveredItemIndex = $('.menu li').index(that);
alert (hoveredItemIndex);
changeToHoverText();
},500);