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

时间:2013-10-10 21:16:25

标签: javascript scope

我对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

我确信我在这里缺少一些基本的东西,但我在范围和背景上阅读了很多内容;显然还不够。

1 个答案:

答案 0 :(得分:2)

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