Node.js从所需对象更改值

时间:2016-10-12 12:40:26

标签: javascript node.js

--- main.js ---

var myModule = require('./module_a.js');
var value = 0;

myModule.set(35);
console.log("myModule.data:", myModule.data);
console.log("myModule.get():",myModule.get());
console.log(myModule);

--- module_a.js ---

exports.data = 10; 
exports.set = function(value) {
    data = value;
};
exports.get = function() {
    return data;
};

我预计main.js的结果是2 console.log()中的每个结果为35。但是,结果是10个。

我不知道为什么会这样。从require方法开始,变量myModule是一个具有data,函数set,函数get的对象。

因此,myModule.set(35)必须将myModule对象的数据更改为35.但是,它仍然是10.

如果我使用this.data = valuereturn this.data。它按我的预期工作。但不是在第一种情况下(我的上面的源代码)

为什么会这样?

3 个答案:

答案 0 :(得分:3)

您的data中没有本地module变量。

尝试更改此行

exports.data = 10; 

var data = 10;
exports.data = data; 

答案 1 :(得分:1)

模块

exports.myObj = {
    data: 10,
    set: function (value) {
        this.data = value;
    },
    get: function () {
        return this.data;
    }
}

主要

var myModule = require('./module_a.js').myObj;
var value = 0;

myModule.set(35);
console.log("myModule.data:", myModule.data);
console.log("myModule.get():",myModule.get());
console.log(myModule);

答案 2 :(得分:0)

当你执行这个赋值data = value;时,javascript引擎会检查你是否在文件中定义了var,如果没有定义它,如果你在的话,它将在模块命名空间中定义var如果你在浏览器上,则在node.js和全局命名空间中,这在任何情况下都是非常糟糕的做法。

您在此处执行的作业exports.data = data;它会在exports对象中创建一个额外的字段。您可以理解,在全局命名空间中定义的data变量与在exports对象中定义的字段无关。