我对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 this
是window
。在#3,它回到MyCtor
。
我确信我在这里缺少一些基本的东西,但我在范围和背景上阅读了很多内容;显然还不够。
答案 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
。