JavaScript中“this”的范围

时间:2010-02-12 18:01:04

标签: javascript

我有一个看起来像这样的JavaScript类:

function SomeFunction()
{
    this.doSomething(function()
    {
        this.doSomethingElse();
    });

    this.doSomethingElse = function()
    {

    }
}

此代码抛出一个错误,因为传递给doSomething()的函数内部的“this”范围与该函数外部的“this”范围不同。

我理解为什么会这样,但是处理这个问题的最佳方法是什么?这就是我最终要做的事情:

function SomeFunction()
{
    var thisObject = this;

    this.doSomething(function()
    {
        thisObject.doSomethingElse();
    });

    this.doSomethingElse = function()
    {

    }
}

这很好,但它只是感觉像一个黑客。只是想知道某人是否有更好的方法。

4 个答案:

答案 0 :(得分:11)

这是正确且普遍接受的解决方法。它有点像kludgy,但它是每个人都做的。通常,此额外变量名为self,如:

function SomeFunction()
{
    var self = this;

    this.doSomething(function()
    {
        self.doSomethingElse();
    });

    this.doSomethingElse = function()
    {

    }
}

答案 1 :(得分:3)

this具有动态“范围”。这意味着它是由任何绑定它设置的,this由“方法调用”绑定。也就是说,您在程序中看到任何时间:w.f()然后执行f时,this动态绑定到f,< em> even 如果f在其词法范围内有this

大多数JavaScript框架都提供了一些处理这个问题的工具。使用Prototype.js(例如),您可以执行此操作:

this.doSomething(function() { this.doSomethingElse(); }.bind(this));

然而你的“黑客”很好。我通常围绕任何需要词法范围(function (self) { ... })(this)变量的函数执行this

答案 2 :(得分:1)

还值得一提的是ECMAScript的下一个版本(JavaScript的语言规范)将引入Function.bind(),它将允许您为函数指定永久上下文。

答案 3 :(得分:0)

这位评论者有我想要的东西(虽然其他答案也很好):

@Jon Kruger看到这个,看看他们的文章也是如此:https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Function/Apply - Jonathon 44分钟前