JavaScript 模块模式和 this

标签 javascript node.js module-pattern

我已经开始尝试使用 Node,并且在单个文件中工作。 这是我的代码的基本原理:

function Validation(){
    this.a = function(){...}
    this.b = function(){...}
    return this;
}

var validation = Validation();

(function(){
    models["a"] = {
        validate: [a, b]
    }
}).call(validation);

这工作得很好。现在我想将验证函数移动到它自己的文件validation.js。因此我将代码更改为:

/* validation.js */
function Validation(){
    this.a = function(){...}
    this.b = function(){...}
    return this;
}

module.exports.Validation = new Validation();


/*  Main file */
var validation = require('./validation');

(function(){
    models["a"] = {
        validate: [a, b]
    }
}).call(validation);

当我尝试运行此代码时,出现错误“ReferenceError:a 未定义”。 我可以通过将 a 更改为 this.a 来解决这个问题,但为什么之前没有 this 关键字就可以工作呢?

最佳答案

Validation(没有 new 关键字)不是构造函数,因此在其中使用 this 可以处理全局对象上下文。

试试这个:

function Validation() {
    return {
        a: function() {...},
        b: function() {...}
    };
}

或者以其他方式使用module.exports.Validation = new Validation();

除了您的实际问题之外。您必须使用 this.a 因为没有导出并可用作 ab 的局部作用域变量(尽管全局对象会发生这种情况) 。您当然可以使用 with (with (this) models["a"] = {validate: [a, b]}) 但最好在全部。所以答案是你必须使用 this.a

关于JavaScript 模块模式和 this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22015409/

相关文章:

javascript - jQuery UI 自动完成显示 AJAX 源的标签和值

javascript - 如何使用nodejs访问json中的数据

node.js - 以编程方式运行 Cakefile

javascript - Arbor.JS 中的单节点错误

javascript - 如何使用chart js绘制如下所示的图表

javascript - 使用 javascript 模块模式时如何从私有(private)方法中调用公共(public)方法?

javascript - 为什么在声明子 namespace 时不能使用 var?

javascript - IIFE 中的变量作用域

javascript - 从 Javascript (JQuery) 调用 C# 函数 (WebMethod)

node.js - Expresscart安装错误npm ERR! Fibers@2.0.0 安装脚本失败