在javascript机箱中访问“this”的首选方法是什么?

时间:2011-09-16 21:37:44

标签: javascript this

我经常有这样的代码:

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 个答案:

答案 0 :(得分:2)

Crockford似乎更喜欢var that=this。如果您正在使用他们似乎使用的ExtJs库 var me= this;。 当真正归结为它时,变量的名称并不重要。确保你使用与你的同伴一致的东西,这对新手程序员来说是有意义的。

答案 1 :(得分: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()[docs]this值绑定到该函数。

function successCallback(data) {
    this.onLoadData(data);
}

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

如果您需要支持不具有.bind()的浏览器,那么我提供的文档链接中有一个垫片可以包含。

答案 2 :(得分:1)

在我的代码中,我使用var that = this;来表示这个用例 - 我也看过self,虽然对我来说有点混乱,但在其他语言中它是一个保留关键字。

据我所知,没有任何其他方法可以解决这个问题,但只要您选择一个仅用于此案例的 关键字,并在整个代码库中一致地使用它,它就是一个漂亮的干净的处理方式。我会避免像object这样的var名称,因为你很可能会在其他地方使用它们,并为自己或维护代码的人创造一个令人困惑的情况。

答案 3 :(得分:0)

不是真的(我知道)。我总是使用that作为名称,虽然它比良好做法更幽默。