2012-05-07 44 views
5

此脚本具有不同的行为,具体取决于它是从节点js shell运行还是存储在传递给节点的脚本文件中。为什么函数在全局对象中不可用?

脚本:

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

在壳输出(仅最后4行相关IMO每个3行是复制/粘贴顺次放置在Mac OS X在终端上运行的节点REPL实例。):

ArrayBuffer 
Int8Array 
Uint8Array 
Int16Array 
Uint16Array 
Int32Array 
Uint32Array 
Float32Array 
Float64Array 
DataView 
global 
process 
GLOBAL 
root 
Buffer 
setTimeout 
setInterval 
clearTimeout 
clearInterval 
console 
:当作为保存的脚本(bash中,从Mac OS X上称为 node myscript.js)运行
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 

输出

为什么它们有什么不同,为什么不能我的脚本看到globalab

编辑:添加一个附加语句C = 2发生变化的输出。 c在运行脚本的两种方法中都可见。尽管如此,这仍然不能解释a和b的存在。

+1

您可以添加到您的实验:1)一个变量赋值没有'var':所以只是做一个'C = 3'; 2)'console.log(this === global)' –

+0

您还可以详细说明如何将这些文件传递给Node? (确切的命令行) –

+0

完成。还有其他什么? – Trindaz

回答

4

基本上是因为节点的REPL使用“全球”范围内,因为它是“本”(你可以测试与global === this)。

然而,常规模块在其自己单独的封闭运行。所以,你可以把它想象为东西这样的:

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

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

+0

谢谢@TooTallNate。当用'(for var k in this)'代替'(for var k in global)''时,它不会打印任何东西。有关我如何遍历脚本创建的符号的任何提示? – Trindaz

+0

在模块内部,'this'指向模块的'exports',而不是全局上下文。但是,我相信无法迭代关闭变量。这只是JavaScript的限制。 – TooTallNate

+0

@TooTallNate您可以使用蛮力来遍历所有变量名称组合:P –

相关问题