试图了解这个 JS 函数的作用及其参数是什么,有人可以解释一下吗?

Trying to understand what this JS function does and what its parameters are, can someone explain?

我正在阅读我最近下载的用于 WebGL 矩阵数学运算的库中的一些代码。但是,我很难理解这个函数的作用。这来自 glMatrix.js 库。

(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
  typeof define === 'function' && define.amd ? define(['exports'], factory) :
  (global = global || self, factory(global.glMatrix = {}));
}(this, function (exports)

什么是工厂parameter/function出口从哪里来?谁能一步一步地告诉我这个函数的作用?

编辑:这只是代码的第一部分,这就是左括号永远不会关闭的原因。

What is the factory parameter/function

这是函数的第二个参数……它的开头在您包含的代码的最后一行定义。剩下的你剪掉。

where does exports come from

调用时。这里:factory(global.glMatrix = {})

这是一种称为UMD, it is a more advanced version of the IIFE设计模式的设计模式。它们都包装了您的代码,创建了一个新的私有范围。两者之间的主要区别在于 UMD 更抽象并且也可以在 node.jsamd 中工作,而不仅仅是浏览器。

您在问题中显示的第一行和最后一行基本上是 IIFE 部分(减去末尾,因为您已经裁剪了它)。您正在调用 iife 并传递 global 又名 window 对象和 factory 函数,您只能在代码中看到 function (exports) 部分。

以下部分检查您使用的环境是节点、amd 还是常规 JS,以便它们将在每个环境要求中定义模块,即 node 只需要您设置exports 对象,amd 需要您使用 define 函数,而在原版 JS 中,您只需将对象添加到 windowglobal 对象.

typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(global = global || self, factory(global.glMatrix = {}));

在 node 和 amd 中你不需要命名你的导出,因为你只需要需要那个文件即 const glMatrix = require("./common.js");,但是在 JS 中你需要从全局对象中检索,这就是为什么它只有一个需要命名,即 factory(global.glMatrix = {})。该行将 glMatrix 属性 添加到全局对象(最初是一个空对象),然后将其作为参数传递给 factory 函数,该函数附加所有函数、值和 类 你应该可以从范围外访问。

UMD 模式的实现可能因图书馆而异。例如,这是一种无需将任何参数传递给 IIFE

即可完成的方法

(function() {
  var global = this;

  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
    typeof define === 'function' && define.amd ? define(['exports'], factory) :
    (global = global || self, factory(global.foo = {}));

  function factory(exports) {
    exports.bar = function() {
      console.log("Hello World!");
    };
  }
})();

foo.bar();

在节点中,您可以创建一个新文件并导出任何您想要的文件。然后 Node 会将这些导出与文件相关联,而不是 属性(这是在浏览器 JS 中发生的情况)。例如,一个名为 foo.js 的文件包含以下内容:

function bar() {
    console.log("Hello World!");
}

exports.bar = bar;

可以像这样从另一个文件访问:

const foo = require("foo.js");
foo.bar();

或者您可以使用 Destructuring:

直接访问属性
const { bar } = require("foo.js");
bar();