我的印象是"这个" keyword表示范围内的当前所有者。显然,这是错误的。让我来看看代码:
alert(this); // alerts as [object Window] -- Okay
function p1() {
alert(this);
}
var p2 = function() {
alert(this);
}
p1(); // alerts as undefined -- ???
p2(); // alerts as undefined -- ??
window.p1(); // alerts as [object Window] -- Okay
window.p2(); // alerts as [object Window] -- Okay
上面的代码首先警告[对象窗口],正如我所料,但接下来两次调用p1()和p2()警告"这" as" undefined"。最后两次调用p1()和p2()警告"这"作为[对象窗口]。
pn()和p2()是否存在于全局(即窗口)范围内?我认为调用window.p1()与调用p1()同义,就像调用alert()与window.alert()同义一样。
以我的(C#)思维方式,p1()和p2()属于全局范围。这些函数是全局窗口对象的成员,所以当它们引用"这个"他们应该指[object Window]。显然,我在这里非常错误。
答案 0 :(得分:3)
请注意您使用的是strict mode
并且符合规范:
如果在严格模式代码中对此进行评估,则不会将此值强制转换为对象。
您在所有警报实例中的代码 alert
window
,但由于您处于严格模式,因此它是undefined
(因为它应该定)
更新:chrome dev工具提醒window
而不是undefined
,但如果将其包装在自动执行功能中,则会按预期获得undefined
(function(){
'use strict';
alert(this);
}());
答案 1 :(得分:2)
当您调用类似foo()
的函数时,this
的值取决于代码是否在strict mode中运行(实际上是默认值)。
在严格模式下,this
将为undefined
(正如您已经发现的那样)。
"松散模式" this
确实会引用window
,但不是,因为这些功能是全局的,即"拥有"在全球范围内。您对本地函数的行为相同:
(function() {
function foo() {
console.log(this); // logs the window object, but `foo` is not global
}
foo();
}());

这只是explicitly defined behavior:
- 如果功能代码是严格代码,请将ThisBinding设置为thisArg。
- 否则如果thisArg为null或未定义,则将ThisBinding设置为全局对象。
- 否则如果Type(thisArg)不是Object,则将ThisBinding设置为ToObject(thisArg)。 ...
醇>
正如你所看到的那样,"松散"模式,如果thisArg
是undefined
,如果你调用函数"通常"如foo()
,它将明确地设置为window
。
答案 2 :(得分:0)
this
表示你指的是那个对象。它主要用于面向对象编程,以区分对象的自身与输入变量。
示例(伪代码):
var1 //instance variable of object
void Constructor(var1){
this.var1 = var1
}
这描述的是构造函数接受一个名为var1
的var,并为其设置自己的变量var1
。
在你的情况下,我会假设在一个函数中:
function p1() {
alert(this);
}
被称为p1();
,它不是严格地在对象上下文中,因此this
并不意味着什么。通过从窗口的上下文window.p1();
调用它,您正在使窗口对象调用该函数,从而为this
提供值。