成员函数中的Javascript“this”object==“window”

Javascript `this` object == `window` in member function

本文关键字:object 函数 window this Javascript 成员      更新时间:2023-09-26

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

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/并且成员回调CCD_ 5有时在被调用时具有错误的CCD_。

为什么,以及如何修复?

在Javascript中有4种方法可以使用函数每一个都改变了this的内容:

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

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

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

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

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

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