3

在我的一些 Javascript 对象中,我发现我的this指针是正确的 - 这些是new Func()-type 对象 - 在创建时,但在分配的方法中它可能是错误的。

function Confused() {
   console.log("checking",this==window,"is always false");
   this.method = function() {
       console.log("checking",this==window,"is true for some funcs but not others");
   };
};

在一些调用(new Confused()).method()- 它似乎已经失去了它的this指针。这种情况发生的时间似乎取决于函数,而不是随机的;它在代码中围绕我如何创建导致这种情况的类。

在http://williame.github.com/barebones.js/上有一个示例,有时调用成员回调时指针G3D._file_loaded错误。this

为什么,我该如何解决?

4

3 回答 3

7

有 4 种方法可以在 Javascript 中使用函数,每种方法的作用都是改变其内容this

  • 函数调用:this = 全局对象(浏览器中的窗口)
  • 方法调用:this = 调用它的对象。
  • 构造函数调用: this = 您正在创建的新对象。
  • 调用/应用调用:this = 您传递的对象。

在您的情况下this == window,当您直接调用函数(Confused())但如果您使用 new(new Confused())调用,那么它将是您正在创建的新对象。

于 2012-08-23T12:13:41.203 回答
4

关键字是this指调用上下文。它永远不会错,但它可能不是你所期望的。

如果使用.call或调用函数,则可以在调用函数时手动设置上下文.apply

此外,如果引用window是您想要的,为什么不使用window而不是this?这是访问窗口对象的一种更可靠的方法。

于 2012-08-23T12:07:37.173 回答
2

除了 David Hedlunds 的解释之外,您还可以像这样“解决”这个问题:

function Confused() {
   var that = this;
   console.log("checking",that==window,"is always false");
   this.method = function() {
       console.log("checking",that==window,"is always false");
   };
};

问题是实际调用您的函数的人可以控制您的函数的上下文。如果你不控制函数调用(也就是说,如果你不能修改代码),那么你就会坚持我给出的解决方案(至少我不知道其他方法)。

虽然该解决方案看起来有点“骇人听闻”,但如果你仔细想想,它确实不是。它只是利用闭包赋予你的力量:D

于 2012-08-23T12:10:38.867 回答