我不确定我理解这些经历的结果:
经验n°1(在新命令行中):
> _
ReferenceError: _ is not defined
at repl:1:2
at REPLServer.self.eval (repl.js:110:21)
at Interface.<anonymous> (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:760:14)
at ReadStream.onkeypress (readline.js:99:10)
at ReadStream.EventEmitter.emit (events.js:98:17)
at emitKey (readline.js:1095:12)
> global
{ global: [Circular],
...
_: [Circular], }
> _
{ global: [Circular],
...
_: [Circular], }
经历n°2(在新命令行中):
> _
ReferenceError: _ is not defined
at repl:1:2
at REPLServer.self.eval (repl.js:110:21)
at Interface.<anonymous> (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:760:14)
at ReadStream.onkeypress (readline.js:99:10)
at ReadStream.EventEmitter.emit (events.js:98:17)
at emitKey (readline.js:1095:12)
> var http = require('http');
undefined
> _
undefined
> global._
undefined
> global
{ global: [Circular],
...
_: [Circular], }
经验n°3(在新命令行中):
> _
ReferenceError: _ is not defined
at repl:1:2
at REPLServer.self.eval (repl.js:110:21)
at Interface.<anonymous> (repl.js:239:12)
at Interface.EventEmitter.emit (events.js:95:17)
at Interface._onLine (readline.js:202:10)
at Interface._line (readline.js:531:8)
at Interface._ttyWrite (readline.js:760:14)
at ReadStream.onkeypress (readline.js:99:10)
at ReadStream.EventEmitter.emit (events.js:98:17)
at emitKey (readline.js:1095:12)
> Object.prototype.toString.call(global._)
'[object Undefined]'
> _
'[object Undefined]'
所以这就是我现在所理解的:
从经验1:
global
对象是在触发第一个get global
时构建的。_
循环引用(这似乎是合乎逻辑的)。根据经验n°2:
global
对象的属性(本例中为require()
)后,_
已设置。undefined
不是循环引用。根据经验n°3:
_
对象(global
)中通过它的属性访问global._
并将其用作方法或语句的参数时,所述操作的结果重新分配值结果_
。所以这是我的问题:
与全球其他属性require
相比,为什么不能立即访问循环引用?
为什么使用global._
的方法/语句的结果会重新分配_
?
访问require
等其他全局属性后,为什么_
的值设置为undefined
而不是[Circular]
?
提前谢谢!
答案 0 :(得分:2)
为什么使用
global._
的方法/语句的结果会重新分配_
?
_
保存最后一个评估语句的值:
> 'foo'
'foo'
> _
'foo'
> var http = require('http');
undefined
> _
undefined
因此,改变_
并不是_
改变_
,而是做更改_
。它最初是未声明的,因为之前没有声明。
在访问其他全局属性(例如require)之后,为什么
[Circular]
的值设置为undefined而不是[Circular]
?
您在第一个示例中看到_
的唯一原因是因为global
刚刚设置为global
(因为global._
是最后一次评估的语句),所以global
循环引用require
。对于带有undefined
的转让声明,该行会产生_
,因此这是放在{{1}}中的值。