在JavaScript闭包中,访问“this”的首选方法是什么?

3

我经常有这样的代码:

function Object() {
}

Object.prototype.getData() {
    // THIS LINE:
    var object = this;
    $.ajax({
        url: '...'
        , success: function(data) {
            object.onLoadData(data);
        }
    })
}

var o = new Object();
o.getData();

我的问题是:上面的“var object = this”位的首选范例是什么?我见过这样的写法:

var self = this;

这个方法看起来不错,我可能会借鉴一下。在匿名函数中,最常见的引用父对象的方式是什么?有更聪明的方法吗?我经常发现自己将“var object = this;”放在大多数对象方法的顶部,似乎有一些巧妙的方法可以避免这种情况。

谢谢!

4个回答

2
在你的代码中,不要使用一个变量。
使用“context”参数来设置回调函数中的“this”值。
Object.prototype.getData = function() {
    $.ajax({
        url: '...',
        context: this, // <-----------set the context for the callbacks
        success: function(data) {
            this.onLoadData(data);
        }
    });
};

如果这个问题不仅仅涉及到$.ajax,那么我会使用bind()[文档]来绑定函数的this值。
function successCallback(data) {
    this.onLoadData(data);
}

Object.prototype.getData = function() {
    $.ajax({
        url: '...',
        success: successCallback.bind( this );
    });
};

如果你需要支持不具备.bind()方法的浏览器,那么你可以在我提供的文档链接中包含一个模拟操作。


我假设您实际上并没有扩展Object.prototype,而只是在问题中恰好使用了Object作为构造函数名称。 - user113716
哇,太棒了!我认为jQuery上下文正是我想要的(不知道为什么以前从未考虑过)。此外,.bind()真的很有趣 - 我可能会使用兼容代码并开始使用它。不幸的是,我还得担心IE7的问题。 - rocketmonkeys

2

Crockford似乎更喜欢使用var that=this。如果您正在使用ExtJs库,它们似乎使用var me=this。但真正重要的不是变量名,而是要确保使用与同事保持一致并对初学者有意义的内容。


1
在我的代码中,我使用var that = this;来处理这个用例 - 我也见过self,不过对我来说会有点混淆,因为在其他语言中它是保留关键字。
据我所知,除此之外没有其他的解决方法,但只要你选择一个仅仅用于这种情况的关键字,并且在整个代码库中一致地使用它,这是一种相当干净的处理方式。我会避免使用像object这样的变量名,因为你很可能会在其他地方使用它们,并为自己或维护你代码的人创造混乱的局面。

0

我不知道有没有(这样的规定)。我总是使用that作为名称,虽然这更多是一种幽默而非良好的实践。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接