Javascript Revealing Module Pattern - 这个和内部函数调用

Roa*_*ter 2 javascript revealing-module-pattern

我最近在我的Javascript中使用了Revealing Module模式来帮助构建我的代码并且一切都很顺利.但是,我对此代码片段感到有点困惑:

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();
Run Code Online (Sandbox Code Playgroud)

的jsfiddle

当我打电话pub()pri()直接,this是指当前实例vm.但是,当我pri()从内部调用时pub()突然this又恢复了引用全局窗口对象.我认为揭示模块模式的目标之一是删除问题this但似乎从另一个函数中调用函数时我失去了它的价值this.

有没有人知道为什么这样,如果有一种方法让这个工作,而不必传递对当前对象的引用?

And*_*rew 8

您的示例结合了调用函数的四种方法中的三种.

构造函数调用

var it = new vm();
Run Code Online (Sandbox Code Playgroud)

在里面function vm,this指的是你要返回对象实例.这是预料之中的.

方法调用

it.pub();
Run Code Online (Sandbox Code Playgroud)

在里面function pub,这指的是与引用相同的对象实例it.再次,这是预期的.

函数调用

pri();
Run Code Online (Sandbox Code Playgroud)

里面function pri,this指的是全局对象.这不是预期的,并且被认为是JavaScript语言中的错误.使用方法调用模式调用'pub'函数,因此很自然地假设在其中使用this时应始终指向当前函数/对象.

补救的办法是你的返回对象存储在虚拟机方法中的局部变量,然后由于作用域,pubpri方法将能够安全地引用对象实例.

function vm() {
    var pub = function () {
        alert("from pub: " + that);
        pri();
    },
    pri = function () {
        alert("from pri: " + that);
    };

    var that = {
        pub: pub,
        pri: pri
    };

    return that;
}
Run Code Online (Sandbox Code Playgroud)