我遇到了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
?
答案 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
。要意识到这一点非常重要。