2011-03-21 126 views
4

“this”的值在下面的程序中是指全局对象还是对象“o”?JavaScript全局对象?

更重要的是,我可以运行哪些代码来测试“this”的引用是什么?

function F() { 
    function C() { 
     return this; 
    } 
    return C(); 
} 

var o = new F(); 

回答

12

它指的是全局对象(window)。

编辑:实际上,它会同时参考,全局对象o,因为它们是相同的。 o必须将对象的引用从F()返回其是与人的window对象从C()返回的对象;)

您可以拨打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

+1简单而简单。 – Jakob 2011-03-21 07:36:05

+0

我认为既然“this”在函数F()内,并且函数f()被分配给对象0,那么它可能会以闭包类型的方式引用对象O. – Leahcim 2011-03-21 07:49:10

+0

@迈克尔:''这个总是特别的。您只能通过将其分配给另一个变量来引用更高范围的“this”。任何你称之为func()的函数都会将this设置为全局对象。 – 2011-03-21 07:51:36

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,它指向浏览器上的全局窗口对象。

enter image description here

+0

非常感谢。正如我告诉Felix King,我认为由于“this”在函数F()内,并且由于函数f()被分配给对象0,所以它可能会以闭包类型的方式引用对象O. – Leahcim 2011-03-21 07:50:36

+0

'this'有点时髦,在函数内部有特殊的含义,因此它不遵循闭包的规则。你当然可以将它分配给一个名称不同的变量,然后在该函数内引用该变量,但不是“this”。 – Anurag 2011-03-21 07:53:21

0

要添加到其他的答案:

当一个函数被调用时,this取决于它如何被称为设置。如果使用myfunc.callmyfunc.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