以下是2个文件:
// main.js
require('./modules');
console.log(name); // prints "foobar"
// module.js
name = "foobar";
当我没有“var”时它起作用。但是当我有:
// module.js
var name = "foobar";
名称将在main.js中未定义。
我听说全局变量很糟糕,你最好在引用之前使用“var”。但这是全局变量好的情况吗?
答案 0 :(得分:157)
全局变量几乎从来都不是一件好事(可能是一两个异常......)。在这种情况下,看起来你真的只想导出你的“名称”变量。如,
// module.js
var name = "foobar";
// export it
exports.name = name;
然后,在main.js ...
//main.js
// get a reference to your required module
var myModule = require('./module');
// name is a member of myModule due to the export above
var name = myModule.name;
答案 1 :(得分:23)
我无法找到全局var
是最佳选择的方案,当然您可以拥有一个,但看看这些示例,您可能会找到更好的方法来完成相同的:
您需要一些在整个应用程序中相同的值,但它会根据环境(生产,开发或测试)而变化,例如邮件类型,您需要:
// File: config/environments/production.json
{
"mailerType": "SMTP",
"mailerConfig": {
"service": "Gmail",
....
}
和
// File: config/environments/test.json
{
"mailerType": "Stub",
"mailerConfig": {
"error": false
}
}
(也为dev做一个类似的配置)
要决定将加载哪个配置,请创建一个主配置文件(这将在整个应用程序中使用)
// File: config/config.js
var _ = require('underscore');
module.exports = _.extend(
require(__dirname + '/../config/environments/' + process.env.NODE_ENV + '.json') || {});
现在你可以像这样获取数据:
// File: server.js
...
var config = require('./config/config');
...
mailer.setTransport(nodemailer.createTransport(config.mailerType, config.mailerConfig));
// File: constants.js
module.exports = {
appName: 'My neat app',
currentAPIVersion: 3
};
并以这种方式使用
// File: config/routes.js
var constants = require('../constants');
module.exports = function(app, passport, auth) {
var apiroot = '/api/v' + constants.currentAPIVersion;
...
app.post(apiroot + '/users', users.create);
...
不是这个人的忠实粉丝,但至少你可以追踪这个名字的使用情况' (引用OP的例子)并进行验证。
// File: helpers/nameHelper.js
var _name = 'I shall not be null'
exports.getName = function() {
return _name;
};
exports.setName = function(name) {
//validate the name...
_name = name;
};
并使用它
// File: controllers/users.js
var nameHelper = require('../helpers/nameHelper.js');
exports.create = function(req, res, next) {
var user = new User();
user.name = req.body.name || nameHelper.getName();
...
当没有其他解决方案而不是全局var
时,可能会有一个用例,但如果您开始使用node.js,通常可以使用其中一种方案在您的应用中共享数据(就像我之前的某个时候一样)尝试组织你在那里处理数据的方式,因为它可能会很快变得混乱。
答案 2 :(得分:11)
如果我们需要共享多个变量,请使用以下格式
//module.js
let name='foobar';
let city='xyz';
let company='companyName';
module.exports={
name,
city,
company
}
用法
// main.js
require('./modules');
console.log(name); // print 'foobar'
答案 3 :(得分:5)
<强>更新强>
保存任何想要作为一个对象共享的变量。然后将它传递给已加载的模块,以便它可以通过对象引用访问变量..
// myModule.js
var shared = null;
function init(obj){
shared = obj;
}
module.exports = {
init:init
}
// main.js
var myModule = require('./myModule.js');
var shares = {value:123};
myModule.init(shares);
旧答案
要在模块之间共享变量,您可以使用函数来获取主模块和模块之间的变量值。
//myModule.js
var mainFunction = null; //You can also put function reference in a Object or Array
function functionProxy(func){
mainFunction = func; //Save the function reference
}
// --- Usage ---
// setTimeout(function(){
// console.log(mainFunction('myString'));
// console.log(mainFunction('myNumber'));
// }, 3000);
module.exports = {
functionProxy:functionProxy
}
//main.js
var myModule = require('./myModule.js');
var myString = "heyy";
var myNumber = 12345;
function internalVariable(select){
if(select=='myString') return myString;
else if(select=='myNumber') return myNumber;
else return null;
}
myModule.functionProxy(internalVariable);
// --- If you like to be able to set the variable too ---
// function internalVariable(select, set){
// if(select=='myString'){
// if(set!=undefined) myString = set;
// else return myString;
// }
// else if(select=='myNumber'){
// if(set!=undefined) myNumber = set;
// else return myNumber;
// }
// else return null;
// }
即使值已更改,您也可以始终从main.js
获取值。
答案 4 :(得分:1)
使用或不使用var关键字声明的变量附加到全局对象。这是通过在没有var关键字的情况下声明变量来在Node中创建全局变量的基础。虽然使用var关键字声明的变量仍然是模块的本地变量。
请参阅此文章以进一步了解 - https://www.hacksparrow.com/global-variables-in-node-js.html
答案 5 :(得分:1)
换一种说法,我认为如果要将代码发布到 struct Node
{
int data;
struct Node* right;
struct Node* left;
}
,global
变量可能是最佳选择,因为您不能确定所有软件包都使用相同的发行版您的代码。因此,如果您使用文件导出npm
对象,则会在此处引起问题。
您可以选择singleton
,global
或跨文件共享的任何其他对象。
请告诉我是否有更好的解决方案。