我一直在使用 Revealing Module pattern最近在我的 Javascript 中帮助构建我的代码,一切都很顺利。但是,我对这段代码片段感到有些困惑:
function vm() {
var pub = function () {
alert("from pub: " + this);
pri();
},
pri = function () {
alert("from pri: " + this);
};
return {
pub: pub,
pri: pri
};
}
var it = new vm();
it.pub();
it.pri();
当我调用 pub()
和 pri()
直接,this
指的是 vm
的当前实例.然而,当我调用 pri()
来自内部pub()
突然this
已恢复为引用全局窗口对象。我认为揭示模块模式的目标之一是消除 this
的问题。但看起来当从另一个函数中调用一个函数时,我丢失了 this
的值.
有没有人知道为什么会这样,如果有一种方法可以让它工作而不必传递对当前对象的引用?
最佳答案
您的示例结合了调用函数的四种方式中的三种。
构造函数调用
var it = new vm();
在 function
vm
中,this
指的是 您要返回的对象实例。这是预期的。
方法调用
it.pub();
在function
pub
中,this 引用与it
引用的相同对象实例。同样,这是预期的。
函数调用
pri();
在function
pri
中,this
引用全局对象。这不是预期的,并且被认为是 JavaScript 语言中的错误。 “pub”函数是通过方法调用模式调用的,因此很自然地假设 this
在其中使用时应始终指向当前函数/对象。
一种补救方法是将返回的对象存储在 vm 方法内的局部变量中,然后由于范围界定,pub
和 pri
方法将能够引用对象实例安全。
function vm() {
var pub = function () {
alert("from pub: " + that);
pri();
},
pri = function () {
alert("from pri: " + that);
};
var that = {
pub: pub,
pri: pri
};
return that;
}
关于Javascript 揭示模块模式 - this 和内部函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18890603/