Javascript 揭示模块模式 - this 和内部函数调用

标签 javascript revealing-module-pattern

我一直在使用 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();

JSFiddle

当我调用 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 方法内的局部变量中,然后由于范围界定,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;
}

关于Javascript 揭示模块模式 - this 和内部函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18890603/

相关文章:

javascript - 揭示模块模式中的私有(private)成员

javascript - 区分 HTML 表单 SUBMIT 和基于控制台的表单 SUBMIT

javascript - 字符串匹配函数返回一个数组,但如果转换为数字,则返回匹配的数字

javascript - 揭示模块模式命名约定

javascript - addEventListener 模块模式

javascript - 我应该如何使用模块模式处理长 JavaScript 文件?

javascript - 使用 Lodash 计算两个标准的总数

javascript - 定义 Typescript 接口(interface),其中属性是现有对象的属性

javascript - 单击按钮后重新加载数据表

javascript - 显示模块模式 (RMP) 的缺点