javascript - 全局变量替代

标签 javascript global-variables

我想创建一个可供所有 .js 文件访问的数组。该数组还必须是可更新的,并且更新后的更改必须反射(reflect)在使用该数组的所有其他文件中。

我读到过使用 GLOBAL 变量不是一个好方法,但有什么替代方法?

//file 1 which contains my global variable
var mySharedArray = ['helo']; 
module.exports = {
mySharedArray: mySharedArray,
get: function(){
    console.log(mySharedArray);
} 
}    

//file 2 where i am pushing new-data 
router.get('/workerequestest',function(req,res){
queue.push("moreData");
require('../config/globalQueue').get();
require('../config/startWorkerQueue');
res.send(200,'message recieved');
});

//file 3 where i am checking the updated values
var interval = setInterval(function() {
var Queue = require('../config/globalQueue').mySharedArray;
require('../config/globalQueue').get();
}, 10000,'hello' ,'checking for New processes');

最佳答案

node.js 中的适当模块化不使用实际的全局变量,因为这使得实际利用可重用模块更加复杂,并可能与其他全局变量发生冲突。

一种可以替代使用的设计模式是将共享数据放在它自己的模块中,然后在该模块中需要的地方只需 require()

// shared-data.js
var mySharedArray = [...];

module.exports = {
    mySharedArray: mySharedArray
}

然后,在每个想要访问该数组的模块中,您可以这样做:

// someothermodule.js

var sharedArray = require('./shared-data.js').mySharedArray;


// this modification will change the main array and will be seen by
// all modules that are sharing it
sharedArray.push("moreData");

这是有效的,因为在 Javascript 中分配数组时,不会复制它们,而是共享指向原始数组的指针。因此,对赋值的任何修改都只是指向原始对象,从而改变了原始数组。因此,所有模块都可以访问同一个原始数组。


我刚刚在我自己的三个文件中测试了这个概念,它工作正常。这是我的三个文件:

服务器文件:

// shared-server.js
var express = require('express');
var app = express();
var server = app.listen(80);
var shared = require('./shared-var');
require('./shared-interval.js')

var cntr = 0;

app.use(express.static('public'));

app.get("/test", function(req, res) {
    shared.mySharedArray.push(++cntr);
    shared.get();
    res.send(200,'message received');
});

共享变量文件:

//shared-var.js
var mySharedArray = ['helo']; 
module.exports = {
    mySharedArray: mySharedArray,
    get: function(){
        console.log(mySharedArray);
    } 
}

间隔文件:

//shared-interval.js
var interval = setInterval(function() {
    require('./shared-var').get();
}, 1000);

当我运行它时,它每秒输出 mySharedArray 的值。每次我去http://localhost/test在我的浏览器中,它向 mySharedArray 添加了一个新值,我在控制台中看到了它。这是我所期望的行为。

关于javascript - 全局变量替代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34862600/

相关文章:

javascript - 防止用户在javascript中完成两次表单

javascript - p5.j​​s 数组元素之间的碰撞

javascript - 触摸屏检测: Chrome 17

string - UIPickerView 从中间选定的行开始

forms - VBA控件引用(窗体)全局变量?

javascript - 从 Electron 调用窗口函数

powershell - 全局变量或单例的替代方案

javascript - 将数组传递给 jade 渲染

javascript - Jquery 在同一脚本中加载

javascript - 如何在 JavaScript 中执行具有 If/else 条件的变量合并?