我有一个看起来像这样的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()
{
}
}
这很好,但它只是感觉像一个黑客。只是想知道某人是否有更好的方法。
答案 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分钟前