2012-08-23 90 views
3

在我的一些Javascript对象中,我发现我的this指针是正确的 - 这些是new Func()-类型对象 - 创建时,但在指定的方法中它可能是错误的。Javascript` this` object ==`window`` in member function

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指针有时被调用时。

为什么,我该如何解决?

+0

[本文](http://www.quirksmode.org/js/this.html)是否回答你的问题? – Znarkus

+1

'this'的值由每个函数调用的特定情况决定。不要紧,一个函数最初被定义为某个对象的属性的值 - 它根本不关心**。重要的是函数的调用方式,就是这样。 – Pointy

回答

6

有4种方法在JavaScript中使用 功能每一种也就是改变什么this的内容是:

  • 函数调用: this =全局对象(浏览器中的窗口)
  • 方法调用:this = this被调用的对象。
  • 构造函数调用:this =你正在创建的新对象。
  • 呼叫/应用呼叫:this =您通过的对象。

在你的情况this == window当您直接拨打电话(Confused())的功能,但如果你调用使用新(new Confused()),那么这将是你所创建的新对象。

+0

这是让我明白的答案。我的代码将该方法作为回调函数传递给另一个函数。我真的不喜欢学习Javascript;它似乎在每个回合都有这样奇怪的,毫无意义的陷阱。好吧。 – Will

4

this关键字指的是调用上下文。它从来不是错误但它可能不是你所期望的。

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

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

2

除了大卫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

+0

这是我链接的代码中的解决方法。我对此感到不满。 – Will

相关问题