【问题标题】:Possible to share global variable between two functions without a file?可以在没有文件的情况下在两个函数之间共享全局变量吗?
【发布时间】:2022-01-17 08:26:36
【问题描述】:

使用下面的代码,我得到了

{ test1: 'aaa', test2: 'bbb' }

这就是我想要的。 IE。能够在t2.jst3.js 之间拥有一个全局变量。

在这个 PoC 中,t3() 仅被调用一次,但在实际情况下,如果将是大约 100 个 t3() 实例,它永远不会结束,因为它们在无限循环中收集数据。 t2.js 不需要修改c

问题

是否可以相同,但没有第三个文件(在这种情况下为t1.js)?

t1.js

module.exports = {};

t2.js

const express = require('express');
const app = express();

let c = require('./t1');
const t3 = require('./t3');

c.test1 = "aaa";
t3();
console.log(c);

app.get('/test.json', (req, res) => {
  res.send(JSON.stringify(c, null, 2));
});    

app.listen(1900, () => {});

t3.js

let c = require('./t1');
module.exports = () => {
  c.test2 = "bbb";
};

【问题讨论】:

    标签: javascript node.js express ecmascript-6 global-variables


    【解决方案1】:

    看起来很简单,在入口点创建一个对象,然后传递它:

    const express = require('express');
    const app = express();
    
    const t3 = require('./t3');
    
    const records = {
      test1: "aaa",
    };
    t3(records);
    console.log(records);
    
    app.get('/test.json', (req, res) => {
      res.send(JSON.stringify(records, null, 2));
    });    
    
    app.listen(1900, () => {});
    
    module.exports = (records) => {
      records.test2 = "bbb";
    };
    

    请注意,无论是在这段代码中,还是在您的原始代码中,都没有使用全局变量(我想require 除外)。

    【讨论】:

    • 我不明白为什么会这样。当您 t3(records)t3 时,只需获得 records 的一次性副本?
    • 不是副本,是同一个对象。模块中的顶级代码无论如何都只运行一次,无论何时/如何导入。
    • 那么 EcmaScript 从不复制函数的参数?
    • 没错,它没有,不是真的。 stackoverflow.com/questions/518000/… 您可以将每个标识符(或变量或参数)视为指向内存中特定结构的东西。传递参数会传递到结构的链接。改变参数会改变结构。将参数重新分配给其他内容不会改变原始参数。
    • const 表示不会重新分配变量 - 它指向的链接永远不会更改到其他位置。改变一个对象并不会改变指向该对象的变量仍然指向该对象的事实。对象的内容可能不同,但对象保持不变。
    猜你喜欢
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2015-03-28
    • 1970-01-01
    相关资源
    最近更新 更多