全局对象/范围和未定义的循环引用

时间:2013-12-04 20:26:46

标签: javascript node.js global circular-reference

我不确定我理解这些经历的结果:

经验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. 从经验1:

    • global对象是在触发第一个get global时构建的。
    • 然后添加_循环引用(这似乎是合乎逻辑的)。
  2. 根据经验n°2:

    • 访问global对象的属性(本例中为require())后,_已设置。
    • 由于某种原因,它已设置但undefined不是循环引用。
  3. 根据经验n°3:

    • _对象(global)中通过它的属性访问global._并将其用作方法或语句的参数时,所述操作的结果重新分配值结果_
  4. 所以这是我的问题:

    • 与全球其他属性require相比,为什么不能立即访问循环引用?

    • 为什么使用global._的方法/语句的结果会重新分配_

    • 访问require等其他全局属性后,为什么_的值设置为undefined而不是[Circular]

    提前谢谢!

1 个答案:

答案 0 :(得分:2)

  

为什么使用global._的方法/语句的结果会重新分配_

_保存最后一个评估语句的值:

> 'foo'
'foo'
> _
'foo'

> var http = require('http');
undefined
> _
undefined

因此,改变_并不是_改变_,而是更改_。它最初是未声明的,因为之前没有声明。

  

在访问其他全局属性(例如require)之后,为什么[Circular]的值设置为undefined而不是[Circular]

您在第一个示例中看到_的唯一原因是因为global刚刚设置为global(因为global._是最后一次评估的语句),所以global循环引用require。对于带有undefined的转让声明,该行会产生_,因此这是放在{{1}}中的值。