关闭和澄清?

时间:2013-04-17 17:50:49

标签: javascript

我遇到了this

的背景问题

在JavaScript中this总是指我们正在执行的函数的“所有者”,或者更确切地说,指向函数是其方法的对象。

所以,这段代码:

var o={

  f:function ()
     {
       console.log(this); //the owner of the function is `o`
     }
}

console.log(o.f()) // this shows the `o` as this

一切都好。

为什么这个代码

var o = {
    f: function ()
    {
        return function ()
        {
            console.log(this);
        }
    }
}
console.log(o.f()())

显示this是全局对象/窗口?

o.f()返回一个函数,然后执行它。但是Hoster对象仍然是o。那么为什么它将主持人显示为window

5 个答案:

答案 0 :(得分:4)

this的值由您调用函数的对象决定,而不是声明函数的位置。

例如,如果您执行了以下操作:

var f = o.f;
console.log(f());

你会看到this也是窗口。

您也可以这样做:

var o2 = { f: o.f };
console.log(o2.f());

在那里,this将是o2对象,而不是o。

在你的情况下,o.f返回一个函数,你在没有对象引用的情况下调用它。在这种情况下,调用的函数被调用,this设置为全局对象(在浏览器中为window)。

如果你想保留this指针,你需要在闭包中捕获它,如下所示:

var o = {
    f: function ()
    {
        var self = this;
        return function ()
        {
            console.log(self);
        }
    }
}
console.log(o.f()())

然后你将拥有正确的对象引用,无论它是如何调用的。

答案 1 :(得分:2)

没有。返回的函数只是一个函数,不托管在任何对象上(这使得this默认为全局对象)。将这种双重调用视为

var temp = o.f();
temp();

而不是那个“所有者上下文”metapher(经常失败),更好地参考MDN's introduction to the this keyword。 “所有者”对象说明仅适用于在对象上调用方法的情况 - 只要您将函数传递给回调函数return,指定它它失去了它的背景。

答案 2 :(得分:2)

this由函数的调用方式设置,而不是根据函数的存储位置设置。

o.f()有效,因为您在f()的上下文中调用了o。如果您要将该函数复制到另一个对象,this将会更改。

例如:

var x = {
  a: o.f
};

console.log(x.a()); // logs x, not o.  because the "context" is x

在第二个示例中,o.f()返回一个函数,然后使用“无上下文”运行。这使“上下文”设置为window

答案 3 :(得分:1)

答案很简单。您将返回一个闭包,然后在窗口范围内对其进行评估。如果您没有返回该功能,则不会出现此问题。

解决方案:

var o = {
  f: function() {
    return function() { console.log(this); }
  }
};
console.log(o.f().apply(o, []));

将封锁的所有权从零开始转移到o(= window

答案 4 :(得分:1)

当函数没有所有者时,获取本地上下文会回退到全局上下文,因为实际上下文是undefined。如果真实的上下文是null,它也会这样做。

非严格模式下的一切都是真的!

在严格模式下,获取本地上下文不会落后于其他任何内容。上下文保持不变,也就是说在非拥有函数的情况下:undefined。要意识到这一点非常重要。