kYu*_*uZz 1 javascript node.js
Node.js似乎使用不同的规则将变量附加到global对象,无论是在REPL中还是在脚本中完成.
$ node
> var a = 1;
undefined
> a
1
> global.a
1
> a === global.a
true
Run Code Online (Sandbox Code Playgroud)
如上所示,在REPL中工作时,声明var变量并在global对象上创建一个具有该变量名称的新属性.
但是,在脚本中似乎不是这种情况:
// test.js
var a = 1;
console.log(a);
console.log(global.a);
console.log(a === global.a);
Run Code Online (Sandbox Code Playgroud)
我们来运行脚本:
$ node test.js
1
undefined
false
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
运行脚本时,它将包装在模块中.脚本中的顶级变量位于模块函数内部,不是全局变量.这是node.js加载和运行脚本的方式,无论是在初始命令行中指定还是加载require().
REPL中运行的代码不包含在模块函数中.
如果您希望变量是全局变量,则将它们专门分配给global对象,这将在脚本或REPL中起作用.
global.a = 1;
Run Code Online (Sandbox Code Playgroud)
全局变量通常在node.js中不受欢迎.相反,通过模块构造函数或其他模块方法传递对它们的引用,根据需要在特定模块之间共享变量.
在node.js中加载模块时,模块的代码将插入到函数包装器中,如下所示:
(function (exports, require, module, __filename, __dirname) {
// Your module code injected here
});
Run Code Online (Sandbox Code Playgroud)
因此,如果a在模块文件的顶层声明一个变量,代码将最终由node.js执行,如下所示:
(function (exports, require, module, __filename, __dirname) {
var a = 1;
});
Run Code Online (Sandbox Code Playgroud)
从那里,您可以看到a变量实际上是模块函数包装器中的局部变量,而不是全局范围中的变量,因此如果您希望它在全局范围内,则必须将其分配给全局对象.
| 归档时间: |
|
| 查看次数: |
2531 次 |
| 最近记录: |