0

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

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

     debugger;  // #1
     myFunc();
     debugger;  // #3
}

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

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

4

1 回答 1

2

对象是 Javascript 中最this烦人且难以理解的概念之一。这是一场赢得比赛的激烈竞争……首先,您必须了解它特定于您调用的每个函数 - 您调用 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构造函数方法的内部。

于 2013-10-10T21:38:12.437 回答