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

前端之家收集整理的这篇文章主要介绍了javascript – 为什么函数在全局对象中不可用?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

此脚本具有不同的行为,具体取决于它是从节点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实例中):

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上称为bash节点myscript.js):

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

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

编辑:添加附加声明c = 2更改了输出.在两种运行脚本的方法中都可以看到c.但是,当从shell运行脚本时,这仍然无法解释a和b的存在.

最佳答案
基本上是因为Node的REPL使用“全局”上下文,因为它是“this”(你可以使用global === this来测试它).

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

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

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

猜你在找的JavaScript相关文章