在下面的程序中,“this”的值是指全局对象还是对象“o”?
更重要的是,我可以运行什么代码来测试“this”的引用是什么?
function F() {
function C() {
return this;
}
return C();
}
var o = new F();
在下面的程序中,“this”的值是指全局对象还是对象“o”?
更重要的是,我可以运行什么代码来测试“this”的引用是什么?
function F() {
function C() {
return this;
}
return C();
}
var o = new F();
它是指全局对象 (window
)。
编辑: 实际上,它将同时引用全局对象 和 o
,因为它们是相同的。 o
将引用从 F()
返回的对象,该对象是从 C()
返回的对象,而 C()
返回的对象是 window
对象 ;)
您可以调用 console.log(this)
来查找它所引用的对象。这应该会在控制台上列出对象的所有方法,并且您应该能够从中推断出它所属的对象。
要使其在 Firefox 中工作,您需要使用 Firebug。不确定 IE 是否适用。
更新:
@Anurag 已经向您展示了如何显式设置 this
。如果您只想引用更高作用域的 this
,您必须明确地将其分配给一个变量。例如:
function F() {
var that = this;
function C() {
console.log(that);
}
C();
}
this
指的是程序中的全局对象。要让this
引用F
的实例,请尝试以下方法:
function F() {
function C() {
return this;
}
return C.call(this); // call C with the object of F as a context
}
var o = new F();
console.log(object)
,但更易于使用。以下是在Chrome中运行此代码示例的屏幕截图。最后一个语句o
的值会自动打印,并且我再次打印它以确保。它记录了DOMWindow
,它是指浏览器上的全局窗口对象。this
在函数内部有一种特殊的含义,因此它不遵循闭包的规则,有点奇怪。当然,你可以将其赋值给一个不同名称的变量,然后在函数内引用该变量,但不能使用 this
。 - Anurag补充其他答案:
当调用函数时,this
根据如何调用而设置。如果使用 myfunc.call
或 myfunc.apply
调用,则 this
设置为第一个传递的参数。如果以“点”形式调用,例如 myObject.myfunc()
,则 this
设置为点之前的任何内容。
这个规则有一个例外,就是可以使用 bind
将 this
的值与其捆绑在一起,在这种情况下,它将是已绑定的任何东西。例如在 var boundfunc = myfunc.bind(myobj);
中,每次调用 boundfunc
时,它就像调用 myfunc
,但是 this
就会引用 myobj
,而不管其他任何事情。 这里是一个示例:
function F() {
var C = function() {
return this;
}.bind(this);
return C();
}
var o = new F();
this
始终是全局对象(如果您在浏览器中,则为 window
),或者如果您处于严格模式,则为 undefined
。
this
总是特殊的。你只能通过将它赋值给另一个变量来引用更高作用域中的this
。任何你调用的函数,如func()
,都会将this
设置为全局对象。 - Felix Kling