为什么函数在全局对象中不可用?

这个脚本根据是从节点js shell运行还是存储在传递给节点的脚本文件中而具有不同的行为。

脚本:

var a = 1; function b(){return 1;} for(var k in global) console.log(k); 

在shell中输出(只有最后4行是与IMO有关的,这3行中的每一行都被顺序复制/粘贴到在Mac OS X上运行在terminal上的节点REPL实例中):

 ArrayBuffer Int8Array Uint8Array Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array DataView global process GLOBAL root Buffer setTimeout setInterval clearTimeout clearInterval console module require a _ b k 

作为保存的脚本运行时输出(在Mac OS X上称为node myscript.js来自bash):

 ArrayBuffer Int8Array Uint8Array Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array DataView global process GLOBAL root Buffer setTimeout setInterval clearTimeout clearInterval console 

他们为什么不同,为什么我的脚本不能在global看到ab

编辑:添加一个额外的陈述c = 2改变了输出。 c在运行脚本的两种方法中都是可见的。 尽pipe如此,从shell中运行脚本仍然不能解释a和b的存在。

基本上这是因为Node的REPL使用“全局”上下文,因为它是“this”(你可以用global === this来testing)。

但是,常规模块在自己的单独closures中运行。 所以你可以想象它是这样的:

 function (module, exports, global) { // your module code } 

所以当你定义一个var在你的脚本中执行它,你真的只是在一个函数闭包中定义它。 但是在REPL中,您正在全球范围内定义var。