新手:Javascript构造函数和范围上下文问题

Newbie: Javascript constructor and scope-context issue

本文关键字:范围 上下文 问题 构造函数 Javascript 新手      更新时间:2023-09-26

我对JS构造函数中的上下文有什么问题感到困惑。在 ctor 中,我声明了一个函数。在调用该函数之前,this设置为 ctor 的上下文。在函数内部,this的值设置为 window 。我不明白为什么。在 HTML 中,ctor 被调用为"new"。

function MyCtor() {
    var myFunc = function() {
         debugger; // #2
         // code for myFunc
     }
     debugger;  // #1
     myFunc();
     debugger;  // #3
}

在调试器 #1 中,this设置为 MyCtor 。在#2 thiswindow。在#3,它又回到了MyCtor.

确定我在这里遗漏了一些基本的东西,但我读了很多关于范围和上下文的内容;显然还不够。

this对象是Javascript中最令人讨厌的难以理解的概念之一。这是一场相当激烈的比赛...首先,您必须了解它将特定于您调用的每个函数 - 您调用 myFunc 的上下文不会按照您想要的方式设置它。这里有一种方法可以做到这一点:

function MyCtor() {
    this.myFunc = function() {
         debugger; // #2
         // code for myFunc
     }
     debugger;  // #1
     this.myFunc();
     debugger;  // #3
}

通常,只有少数情况下,您可以将函数的this作为特定值。据我所知,所有这些都是:

objectToBeThis.aFunction = function() { ... } // declare this function as
// an object property at any time - 
objectToBeThis.aFunction();

或者,不经常使用的是:

aFunction.call(objectToBeThis, extraArgument1, extraArgument2);

当调用一个命名但不是"拥有"的函数(即var functionName = function()function functionName()(时,它将window作为其this参数。这部分我不太确定,但我只是不会在这种方法中使用this

与代码的情况一样,还有"new MyCtor" - 在其中创建一个要返回的新对象,并且该对象设置为在构造函数方法内部this