【问题标题】:nodejs variable undefined when exporting导出时未定义nodejs变量
【发布时间】:2022-02-13 09:52:52
【问题描述】:

嘿,我想知道为什么以下返回未定义:

let variable;

module.exports.initialize = () => {
  variable = "123";
};

module.exports.variable = variable;


我只需要文件 A 中的模块,然后调用初始化函数。在文件 B 中,我需要它和 console.log 变量,但它返回未定义。我在这里错过了什么?

【问题讨论】:

  • 很明显,您在导出变量值之前从未调用过initialize()
  • @Bergi 我在文件 A 中,为了简单起见,我没有包括在内。
  • 但你称它为 undefined 已被导出

标签: javascript node.js express


【解决方案1】:

module.exports.variablemodule.exports 对象的属性。初始化模块时,将 variable 的值分配给 module.exports.variable 属性,并且在分配时该值是 undefined(因为尚未调用 initialize() 函数)。

因此,当您的模块完成自身初始化时,module.exports.variableundefined

然后,稍后其他人调用module.exports.initialize(),这会将您模块中的本地variable 更改为"123"。这根本不影响module.exports.variable 属性的值。它仍然是undefined

以后,请不要将属性或变量命名为variable,因为这会导致文档或讨论变得非常困难。一个不与单词variable 的英文定义冲突的不同名称将简化对这段代码的讨论。


你可以做的是导出一个对象而不是一个普通的值。

let myObj = { name: "John"};

module.exports.setName = (name) => {
  myObj.name = name;
};

module.exports.sharedObj = myObj;

那么,为什么要在其他地方导入它

const aModule = require('./otherModule');
console.log(aModule.sharedObj);         // {name: "John"}

aModule.setName("Bob");
console.log(aModule.sharedObj);         // {name: "Bob"}

因为 Javascript 中的对象是通过指针分配的,所以当您在模块初始化中执行 module.exports.sharedObj = myObj; 时,它会将指向 myObj 的指针放入 module.exports.sharedObj 所以当 myObj 更改时,任何查看 module.exports.sharedObj 的人都会看到也改变。这仅适用于 Javascript 中的对象,不适用于其他类型的值(字符串、数字等)。

【讨论】:

  • 我同意,也许我应该叫它别的名字。但是如何更改我试图在初始化函数中导出的“变量”?
  • 我看到了你的更新,非常感谢!怎么样:module.exports.variable = "123";在初始化函数内部,这要短得多,根本不需要对象,而且更短
  • @sharpness - 执行module.exports.variable = "123" 可以工作,但您必须注意如何导入它。如果你这样做:let myVar = require('./otherModule').variable;,那么 myVar 将永远不会改变。如果将其导入为const myModule = require('./otherModule'),然后检查myModule.variable,那么它将起作用。关键是您必须保存包含对象并引用该包含对象的属性。
【解决方案2】:

在 JavaScript 中有两种类型的值:1)原始类型和 2)引用类型原始值总是被它们的值复制,引用类型总是被它们的引用(而不是它们的值)复制。

原始值示例:undefined, null, boolean, string, number。 引用类型的例子:除了原始类型之外的所有类型。例如,Object, array 等。请参阅下面的 sn-p。

原始类型示例

let a = 10;
let b = a;

console.log(a);
console.log(b);

b = 20;

console.log(a);
console.log(b);

引用类型示例

let obj_a = {value: 1}
let obj_b = obj_a;

console.log(obj_a);
console.log(obj_b);

obj_b.value = 20;

console.log(obj_a);
console.log(obj_b);

因此,当您将变量声明为let variable 时,其值为undefined,而当您分配module.exports.variable = variable 时,您只需将其值设置为undefined

请参见下面的示例。

const myExports = {};

let variable;

function initialize() {
  variable = 10;
}

myExports.variable = variable;

console.log(variable);
console.log(myExports.variable);

initialize();

console.log(variable);
console.log(myExports.variable);

但是,如果您要使用 引用类型(例如,object)初始化 variable,那么 module.exports.variable 将反映您的 @ 属性的任何更改987654332@变量。

例子:

const myExports = {};

let object = {};

function initialize() {
  object.value = 10;
}

myExports.variable = object;

console.log(object);
console.log(myExports.variable);

initialize();

console.log(object);
console.log(myExports.variable);

希望它有意义。

【讨论】:

    【解决方案3】:

    尝试在 module.exports.initailize 函数中初始化变量

    module.exports.initialize = () => {
        let variable;
        variable = "123";
    };
    
    
    
    module.exports.variable = variable;
    

    【讨论】:

    • 现在在严格模式下甚至会抛出异常,而不仅仅是导出undefined
    猜你喜欢
    • 1970-01-01
    • 2018-06-29
    • 2017-08-03
    • 1970-01-01
    • 2023-03-14
    • 2018-05-29
    • 1970-01-01
    • 2016-07-31
    • 2020-05-06
    相关资源
    最近更新 更多