“this”的值是指全局对象还是下面程序中的对象“o”?
更重要的是,我可以运行什么代码来测试“this”的引用是什么?
function F() {
function C() {
return this;
}
return C();
}
var o = new F();
答案 0 :(得分:12)
它指的是全局对象(window
)。
编辑:实际上,它将同时引用全局对象和 o
,因为它们是相同的。 o
将引用从F()
返回的对象,该对象是从C()
window
对象返回的对象;)
您可以致电console.log(this)
找出它引用的对象。它应该为您提供控制台上对象的所有方法的列表,您应该能够从中推断出它是哪个对象。
为了在Firefox中工作,你需要Firebug。不知道IE。
<强>更新强>
@Anurag already showed you how to explicitly set this
。如果您只想引用更高范围的this
,则必须明确地将其分配给变量。例如:
function F() {
var that = this;
function C() {
console.log(that);
}
C();
}
答案 1 :(得分:2)
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();
在Chrome上,您只需输入要检查的变量,其值就会被记录下来。它与执行console.log(object)
类似,但更容易使用。这是在Chrome中运行此代码示例的屏幕截图。最后一个语句o
的值会自动打印出来,我再次打印它,只是为了确定。它记录了DOMWindow
,它引用了浏览器上的全局窗口对象。
答案 2 :(得分:0)
要添加其他答案:
调用函数时,this
的设置取决于调用方式。如果使用myfunc.call
或myfunc.apply
调用它,则this
将设置为第一个传递的参数。如果以“虚线”形式调用,即myObject.myfunc()
,则this
设置为点之前的任何内容。
此规则有一个例外,即可以使用this
烘焙bind
的值,在这种情况下,它将是绑定的任何内容。即在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
1}}。