1

我创建了以下函数来绑定到我页面中所有类型为“.wrapper”的类。我遇到的问题是,当我触发任何这些事件时,var 'this' 不再指向绑定它的特定循环,而是在循环绑定的最终迭代中使用的 'this'。这似乎是我理解 var 在绑定时如何存储的错误,而不是作为值,它们存储为指针。任何人都可以帮助向我展示如何使这些绑定保持与它们的对象相关。

谢谢德文

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()块中的最后一个元素。当您的onRefresh,onScrollMove等函数运行时,它们不会在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 回答