JavaScript全局对象?

4

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

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

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

var o = new F();
3个回答

11

它是指全局对象 (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"在函数F()内部,并且函数f()被分配给对象0,因此它可能以闭包方式引用了对象O。 - Leahcim
@Michael:this总是特殊的。你只能通过将它赋值给另一个变量来引用更高作用域中的this。任何你调用的函数,如func(),都会将this设置为全局对象。 - Felix Kling

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

非常感谢。正如我告诉Felix King的那样,我认为由于“this”在函数F()内部,并且函数f()被分配给对象0,因此它可能以闭包方式引用了对象O。 - Leahcim
this 在函数内部有一种特殊的含义,因此它不遵循闭包的规则,有点奇怪。当然,你可以将其赋值给一个不同名称的变量,然后在函数内引用该变量,但不能使用 this - Anurag

0

补充其他答案:

当调用函数时,this 根据如何调用而设置。如果使用 myfunc.callmyfunc.apply 调用,则 this 设置为第一个传递的参数。如果以“点”形式调用,例如 myObject.myfunc(),则 this 设置为点之前的任何内容。

这个规则有一个例外,就是可以使用 bindthis 的值与其捆绑在一起,在这种情况下,它将是已绑定的任何东西。例如在 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接