1

ページ内の「.wrapper」タイプのすべてのクラスにバインドする以下の関数を作成しました。私が抱えている問題は、これらのイベントのいずれかをトリガーすると、var 'this' が特定のループであるバインディングを指しなくなり、ループ バインドの最後の反復で使用された 'this' を指すことです。これは、変数が値としてではなく、バインディング時にどのように格納されるかについての私の理解に間違いがあるようです。それらはポインタとして格納されます。これらのバインドをオブジェクトに関連したままにする方法を教えてくれる人はいますか?

ありがとうデヴィン

var pullUpEl, pullUpOffset, generatedCount = 0, index = 0, wrappers = [];

$('.wrapper').each(function () {
    if ($(this).hasClass('tooltip')) {
        pullUpEl = $(this)[0].getElementsByTagName("div")[0].getElementsByTagName("div")[0];
        pullUpOffset = pullUpEl.offsetHeight;

        wrappers[index] = new iScroll($(this).attr('id'), {
            useTransition: true,
            fadeScrollbar: true,
            hideScrollbar: false,
            hScrollbar: false,
            //snap: 'li',
            onRefresh: function () {
                if (pullUpEl.className.match('loading')) {
                    pullUpEl.className = '';
                    pullUpEl.querySelector('.pullUpLabel').innerHTML = 'Pull up to load more...';
                }
            },
            onScrollMove: function () {
                if (this.y < (this.maxScrollY - 5) && !pullUpEl.className.match('flip')) {
                    pullUpEl.className = 'flip';
                    pullUpEl.querySelector('.pullUpLabel').innerHTML = 'Release to refresh...';
                    this.maxScrollY = this.maxScrollY;
                } else if (this.y > (this.maxScrollY + 5) && pullUpEl.className.match('flip')) {
                    pullUpEl.className = '';
                    pullUpEl.querySelector('.pullUpLabel').innerHTML = 'Pull up to load more...';
                    this.maxScrollY = pullUpOffset;
                }
            },
            onScrollEnd: function () {
                if (pullUpEl.className.match('flip')) {
                    pullUpEl.className = 'loading';
                    pullUpEl.querySelector('.pullUpLabel').innerHTML = 'Loading...';
                    pullUpAction(this, pullUpEl.parentNode.getElementsByTagName("ul")[0]);
                }
            }
        });
    } else {
        wrappers[index] = new iScroll($(this).attr('id'));
    }
    index++;
});
4

2 に答える 2

1

の問題ではなく、 の問題thisですpullUpEl。これをグローバルにしたので、最終的な値は.each()ブロックの最後の要素です。onRefreshonScrollMoveなどの関数が実行されるとき、それらpullUpElは実際に変更されているコンテキストでは実行されません。したがって、基本的に、どの要素がこれをトリガーしても、すべての変更は毎回ループの最後の要素で実行されます。

于 2012-06-07T18:09:23.633 に答える
0

非公式にthisは、最初の字句的に囲んでいる のコンテキスト (暗黙のパラメーター) に評価されますfunction。ただし、それをキャプチャできます:

function f() {
    var self = this;
    function g() {
        // here "self" evaluates to the context of f, "this" evaluates to the one of g
    }
}

ブラウザ コンソールで実行するには、次を試してください。

function f() {
    var self = this;
    return function g() {
        console.log(String(self));
        console.log(String(this));
    }
}

f.apply(1).apply(2)

詳細については、ECMA 262、11.1.1を参照してください。

thisキーワードThisBindingは、現在の実行コンテキストの値に評価されます。

規格では、ThisBinding関数コードを入力するとき、またはコードを入力するときにのみ変化することが規定されていevalます。

于 2012-06-07T18:01:58.117 に答える