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

Javascript 为什么函数在全局对象中不可用?,javascript,node.js,Javascript,Node.js,此脚本具有不同的行为,这取决于它是从节点js shell运行还是存储在传递给节点的脚本文件中 脚本: var a = 1; function b(){return 1;} for(var k in global) console.log(k); shell中的输出(只有最后4行与IMO相关。3行中的每一行都按顺序复制/粘贴到Mac OS X终端上运行的节点REPL实例中): 作为保存的脚本运行时的输出(从Mac OS X上的bash调用节点myscript.js): 为什么它们不同,为什么我的

此脚本具有不同的行为,这取决于它是从节点js shell运行还是存储在传递给节点的脚本文件中

脚本:

var a = 1;
function b(){return 1;}
for(var k in global) console.log(k);
shell中的输出(只有最后4行与IMO相关。3行中的每一行都按顺序复制/粘贴到Mac OS X终端上运行的节点REPL实例中):

作为保存的脚本运行时的输出(从Mac OS X上的bash调用
节点myscript.js
):

为什么它们不同,为什么我的脚本不能在
全局中看到
a
b


编辑:添加附加语句c=2更改了输出。在运行脚本的两种方法中都可以看到c。但这仍然不能解释从shell运行脚本时a和b的存在。

基本上这是因为节点的REPL使用“全局”上下文作为“This”(您可以使用
global==This
来测试)

但是,常规模块在各自独立的闭包中运行。所以你可以想象它是这样的:

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

因此,当您在中定义
var
并将其作为脚本执行时,实际上只是在函数闭包中定义它。但是在REPL中,您是在全局级别定义var。

您可以添加到您的实验中吗:1)没有
var
的变量赋值:所以只需执行
c=3
;2)
console.log(this==global)
您还可以详细说明如何将这些文件传递到节点吗?(确切的命令行)您是否尝试过
console.log(this==global)
?另外,当您迭代使用
this
而不是
global
的属性时会发生什么情况?使用
this
没有帮助-它在作为脚本文件运行时不会打印任何键,在REPL.Ates中的工作原理与global相同我向您的持久性致敬
console.log(脚本中的this===global==false
,REPL中的
==true
。谢谢@TooTallNate。将
(用于全局变量k)
替换为
(用于此变量k)
时,它不会打印任何内容。关于如何遍历脚本创建的符号的任何提示?在模块内,
指向模块的
导出
,而不是全局上下文。然而,我认为根本没有方法对闭包变量进行迭代。这只是JavaScript的一个限制。@Tootallate您可以使用蛮力来迭代所有变量名组合:P
ArrayBuffer
Int8Array
Uint8Array
Int16Array
Uint16Array
Int32Array
Uint32Array
Float32Array
Float64Array
DataView
global
process
GLOBAL
root
Buffer
setTimeout
setInterval
clearTimeout
clearInterval
console
function (module, exports, global) {
  // your module code
}