试图了解此JS函数的功能及其参数是什么,有人可以解释吗?

时间:2019-04-13 20:47:03

标签: javascript closures amd commonjs

我正在阅读我最近下载的用于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)

工厂参数/功能是什么?出口来自何处?有人可以逐步指导我完成此功能吗?

编辑:这只是代码的第一部分,这就是开括号从未关闭的原因。

2 个答案:

答案 0 :(得分:2)

这是一个称为UMD的设计模式,它是IIFE设计模式的更高级版本。它们都包装了您的代码,创建了一个新的私有范围。两者之间的主要区别在于this.setState({ string: this.arrayStr, uint: this.arrayUint }, () => { var json = JSON.stringify(this.state); console.log(json); }); 更抽象,并且将在UMDnode.js中运行,而不仅仅是浏览器。

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

以下部分检查您使用的环境是节点,amd还是常规function (exports),以便它们将在每个环境要求中定义模块,即JS仅需要您设置{{ 1}}对象,node需要您使用exports函数,而在普通amd中,您只需将对象添加到defineJS对象中。 / p>

window

在node和amd中,您不需要命名导出,因为您只需要该文件,即global,但是在JS中,您需要从全局对象中检索,这就是为什么它仅是一个需要被命名为typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (global = global || self, factory(global.glMatrix = {})); 。该行将const glMatrix = require("./common.js");属性添加到全局对象(最初是一个空对象),然后将其作为参数传递给您的factory(global.glMatrix = {})函数,该函数将附加您应该能够使用的所有函数,值和类从范围之外访问。

glMatrix模式的实现可能因库而异。例如,这是一种无需传递任何参数到factory

的方法

UMD

在节点中,您可以仅创建一个新文件并导出所需的任何内容。然后,Node将把这些导出与文件而不是属性关联(这在浏览器JS中会发生)。例如,一个名为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();

可以从另一个文件访问,如下所示:

foo.js

或者您可以使用Destructuring直接访问属性:

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

exports.bar = bar;

答案 1 :(得分:1)

  

什么是出厂参数/功能

这是该函数的第二个参数…的开头在所包含的代码的最后一行中定义。其余的都剪掉了。

  

出口来自哪里

调用时。此处:factory(global.glMatrix = {})