0

到目前为止,为了清楚地理解,我认为 始终是指函数的所有者。

我主要考虑了三种情况。

  1. 实例方法,这是调用该方法的实例。
  2. 事件处理程序,元素是调用事件的函数的所有者。
  3. 全局命名空间中的函数,窗口是函数的所有者

但是当我创建一个内部函数并在那里调用该函数时会发生什么。即使在这种情况下,这也是指窗口。

function outer(){
    var inner = (function(){
        console.log(this);
    })
    inner();
}

outer();

任何人都可以简单地解释为什么这指的是窗口。

4

2 回答 2

3

您正在考虑 OO 术语,但您发布的代码不是 OO。正如 Rob W 在他的帖子中所说,默认thiswindowor undefinedin strict 模式。

this仅在特定功能或情况根据上下文为其提供值时才更改值。

在类模拟中使用函数的地方,即实例化(通过new)而不是简单地调用,this指向您所期望的实例。

function Dog(name) {
    this.name = name;
    alert(name);
}
var fido = new Dog('Fido'); //alerts 'Fido'

提供上下文的其他情况this包括事件处理程序(至少在addEventListener模型中,而不是较旧的 IE)以及您自己使用call()apply()手动设置this上下文的任何时间。

另外,不要认为this指向 JavaScript 中的函数“所有者”。在一个事件中,this指向受影响的元素,但将该元素视为“拥有”回调函数是没有帮助的——它只是在该元素的上下文中运行。

最后,正如 Quentin 提到的,没有办法引用this. 您必须先将其缓存在变量中。

function Dog() {
    var that = this;
    setTimeout(function() {
        alert(this); //window - setTimeout() has overwritten the 'this' context
        alert(that); //we reference our cached, outer context
    }, 500);
}
var fido = new Dog('Fido');
于 2012-06-30T10:47:04.370 回答
1

this(在没有newbind或魔法的call情况下apply)指的是调用函数的对象。

如果没有对象,则使用默认对象。对于网络浏览器,该对象是window.

// all comments apply to "inside the body of the bar function"
foo.bar();     // this is foo
foo.baz.bar(); // this is baz
bar();         // this is window

您可以将 的值复制this到您正在调用的函数范围内的另一个变量。

function outer(){
    var that = this;
    var inner = (function(){
        console.log(that);
    })
    inner();
}

outer();

…你可以改变this使用各种方法的价值。

function outer(){
    var inner = (function(){
        console.log(this);
    })
    inner.apply(this);
}

outer();
于 2012-06-30T10:45:02.687 回答