1

intervalIsClear が true の場合、hoveredItemIndex は LI 要素のインデックスを正常に取得しています。

intervalIsClear が false の場合、hoveredItemIndex は setTimeout() 内で宣言されていますが、-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);
                    }
                }
4

3 に答える 3

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);
    }
}
于 2013-04-30T13:17:51.763 に答える
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()

于 2013-04-30T13:14:28.983 に答える
2

thisのコールバックでsetTimeoutは、外部と同じではありません。

次のことを行う必要があります。

                var that = this;
                hello = setTimeout(function(){
                    hoveredItemIndex = $('.menu li').index(that);
                    alert (hoveredItemIndex);
                    changeToHoverText();
                },500);
于 2013-04-30T13:13:59.287 に答える