0

一位面试官要求我解释以下代码中这代表什么。我对此一无所知。因为我以前没有见过这样的代码。请告诉我这两者之间有什么区别,这些代码在什么情况下有用?

function A(){
    this.x=1;//No.1
    function B(){
        this.y=2;//No.2
    }
}

我只知道当我使用new创建一个新对象时,它的属性x等于1;

4

3 回答 3

4

这取决于您如何调用该函数。如果您将其作为常规函数调用,如下所示:

A();

然后this将是window文档的对象。

如果将函数用作对象构造函数,如下所示:

var a = new A();

thenthis将是对新创建对象的引用。

this函数中的引用B永远不会是任何东西,因为不可能调用该函数。A它在函数内部是本地的,并且由于A函数中没有可用于调用B函数的代码,因此永远不会调用它。

如果我们可以调用该B函数,则与该A函数相同。什么this取决于您如何使用该功能。即使您在函数用作构造函数(因此是 中的对象引用)时B从函数内部调用该函数,该函数也不会继承自. 它要么是对(何时用作函数)的引用,要么是对新创建对象的引用(如果用作构造函数)。AAthisABthisAwindowBB

于 2012-10-21T09:08:29.203 回答
2

如果 this 在正常window上下文中使用,则两者都this引用窗口,即使命名范围不同。

这是您发布的代码的调整版本:

function A(){
    this.x=1;//No.1
    function B(){
        this.y=2;//No.2
        console.log(this)      // log `this`
    }
    console.log(this)          // log `this`
    B()                        // Run function B()
}
A()                            // Run function A()

这会将每个记录this在控制台中。它返回

window
window

如果您从不同的上下文(例如分配为事件处理程序)调用 A(),this //No.1将引用相关对象。this //No. 2仍然会window

于 2012-10-21T08:56:20.103 回答
0

This.x 和 This.y 指的是窗口。但是您不能访问函数 B。它会显示错误,例如 B() 未定义。在萤火虫控制台模式下查看

于 2012-10-21T09:00:08.187 回答