Javascript 关于下划线'开头部分的混淆;s源代码

Javascript 关于下划线'开头部分的混淆;s源代码,javascript,Javascript,我试图查看random library的源代码,以了解创建我自己的库的要点,但我在下划线的源代码开头遇到了一些问题,如下所示: // Baseline setup // -------------- // Establish the root object, `window` (`self`) in the browser, `global` // on the server, or `this` in some virtual machines. We use `self`

我试图查看random library的源代码,以了解创建我自己的库的要点,但我在下划线的源代码开头遇到了一些问题,如下所示:

  // Baseline setup
  // --------------

  // Establish the root object, `window` (`self`) in the browser, `global`
  // on the server, or `this` in some virtual machines. We use `self`
  // instead of `window` for `WebWorker` support.
  var root = typeof self == 'object' && self.self === self && self ||
            typeof global == 'object' && global.global === global && global ||
            this;

  // Save the previous value of the `_` variable.
  var previousUnderscore = root._;

  // Save bytes in the minified (but not gzipped) version:
  var ArrayProto = Array.prototype, ObjProto = Object.prototype;
  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;

  // Create quick reference variables for speed access to core prototypes.
  var push = ArrayProto.push,
      slice = ArrayProto.slice,
      toString = ObjProto.toString,
      hasOwnProperty = ObjProto.hasOwnProperty;
我的问题是:

1) 根变量表达式的用途是什么?我看到它正试图看看是否有一个窗口对象。但是什么是全局对象,因为它在浏览器上是未定义的

2) 为本机方法创建独立变量的目的是什么?这些本机方法易于访问,而无需将它们存储为不必要的变量

3) 就下划线而言,符号原型的目的是什么?以前从没见过这样用过

无论如何,谢谢你帮我澄清这一点。

1)在
node.js
中,
global
相当于浏览器的
窗口
,正如注释中所述,
这在某些虚拟机中
。这是为了让库在跨平台时表现出相同的行为

2) 显然,
ArrayProto
ObjectProto
在代码库中被大量使用,因此使用较短的引用似乎很方便


3) 您可以阅读pull请求,显然

1。请参见第2行上方的注释。缩小
global
对象在浏览器中未定义,但在node.js中定义。
窗口
对象在node.js中未定义,但在浏览器中定义。下划线只是试图找到真正的全局对象,它要么是
全局的
,要么是
窗口的
(它显然别名为
self
),要么就是
这个
,如果不是在严格模式下,它就同时存在于这两个窗口上。