对于一个js文件,全局变量在文件的所有代码级别都以访问,我们写一个文件 model.js:

// model.js
var v1 = 1;
function set(value){
v1 = value;
}
function get(){
return v1;
}

这里,v1 是一个全局变量,在文件的各个位置都可以访问。

那么,对于nodejs程序,这里的v1是一个什么级别的变量呢?

我们把model.js改造成可包含的模块: 

// model.js
var v1 = "Oh";
function set(value){
v1 = value;
}
function get(){
return v1;
}

module.exports = {get,set}

如果有其他文件包含model.js,v1是什么级别的变量呢?

我们再写一个文件: app.js

const m1 = require("./model");

m1.set("Hello!");
let v = m1.get();
console.log(v);

运行app.js:

[root@iZ2zebh6hcw1hmlq0t16egZ node]# node test.js 
Hello!

我们发现,model.js中的v1依然是全局变量。

再改造下app.js:

const m1 = require("./model");
const m2 = require("./model");
m1.set("Hello!");
let v = m2.get();
console.log(v);

运行app.js:

[root@iZ2zebh6hcw1hmlq0t16egZ node]# node test.js 
Hello!

我们发现,model.js不管被谁包含几次,v1依然是全局变量,而且只有一个实例,并没有随着不同的包含而定义出新的变量。

结论是,js文件中的全局变量,在nodejs程序的整个运行期间都是全局的,而且是超全局的,各个子模块都可以访问。