重写并向我的命名空间中添加一个javascript库

重写并向我的命名空间中添加一个javascript库,javascript,javascript-namespaces,Javascript,Javascript Namespaces,我打开了一个名为Jibberish()的javascript项目,我试图理解它的编码风格,我只给出了它的开始和结束部分: (function (root, factory) { if (typeof exports === 'object') { // Node. module.exports = factory(); } else if (typeof define === 'function' && define.amd) {

我打开了一个名为Jibberish()的javascript项目,我试图理解它的编码风格,我只给出了它的开始和结束部分:

(function (root, factory) {
    if (typeof exports === 'object') {
        // Node. 
        module.exports = factory();
    } else if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(factory);
    } else {
        // Browser globals (root is window)
        root.GibberishAES = factory();
    }
}(this, function () {
    'use strict';
    var Nr = 14,
    /* Default to 256 Bit Encryption */
    Nk = 8,
    Decrypt = false,
    enc_utf8 = function(s)
    {
        try {
            return unescape(encodeURIComponent(s));
        }
        catch(e) {
            throw 'Error on UTF-8 encode';
        }
    },
    //...................................
    return {
        "size": size,
        "h2a":h2a,
        "expandKey":expandKey,
        "encryptBlock":encryptBlock,
        "decryptBlock":decryptBlock,
        "Decrypt":Decrypt,
        "s2a":s2a,
        "rawEncrypt":rawEncrypt,
        "rawDecrypt":rawDecrypt,
        "dec":dec,
        "openSSLKey":openSSLKey,
        "a2h":a2h,
        "enc":enc,
        "Hash":{"MD5":MD5},
        "Base64":Base64
    };
}));
只是想了解一下它的用法:

// GibberishAES.enc(string, password)
// Defaults to 256 bit encryption
enc = GibberishAES.enc("This sentence is super secret", "ultra-strong-password");
alert(enc);
GibberishAES.dec(enc, "ultra-strong-password");
我可以看到最外层的自执行函数在代码末尾返回一个对象,该对象实际上是匿名的(!),该对象的成员是自执行函数内部定义的函数,因此,属性
“size”
指的是定义为函数表达式的
函数size()

size = function(newsize){...}
我甚至可以通过将所有返回函数调用为
public
,将其余函数调用为
private
,来回忆这种方法中有关私有函数和公共函数的所有讨论,但有一些事情让我非常困惑:

  • 为什么外部匿名函数有参数,它们将在哪里使用

  • 而不是
    (function(){//put my code here…}())作者使用了
    (函数(根,工厂){//some code…}(this,function(){//main code here…})),为什么会这样

  • 关于问题(2),我可以看到两个参数
    this
    function(){//main code here…}
    作为参数传递给外部匿名函数,而不是
    root
    factory
    。所以,
    root
    变成了
    this
    !但是,现在这个
    指的是哪里

  • 也许我们能更好地重写这一切? 我刚读过,我发现Jaco Pretorius的答案非常棒,我可以重写这个答案并将其添加到我的命名空间中,就像这样:

    (功能(myGibberishAES){

    //主代码在这里

    }(window.mygibbershaes=window.mygibbershaes | |{})

  • 这符合可接受的编码标准吗

    谢谢

    这种格式称为UMD(通用模块定义),它是一种编写代码的方法,可以在有AMD(异步模块定义)和无AMD(异步模块定义)的情况下工作,也可以在有节点和无节点的情况下工作

    在第一个匿名函数中,代码检查我们所处的环境

  • 如果定义了
    exports
    函数,那么我们可能使用的是node.js
  • 如果有一个名为
    define
    的函数,并且它有一个名为
    amd
    的属性,那么这意味着我们正在使用amd
  • 如果上述情况都不成立,我们没有使用任何东西,因此我们应该将其附加到根对象,在这种特殊情况下,根对象将是
    window
  • 此函数的参数是
    this
    (将是
    window
    )和基本上是工厂的函数,即实际定义对象的代码。通常情况下(没有UMD),它看起来是这样的:

    var myModule = (function() {
        ...
    }();
    
    现在工厂基本上就是这个函数,它返回模块/对象。如果使用node.js,可以将此对象分配给
    模块。导出
    ,如果使用AMD,则可以将其传递到
    定义
    函数,或者只需将其附加到根对象(
    窗口

    至于您的重写问题,您可能不想这样做,因为常规的JavaScript名称空间声明模式不适用于node.js和AMD。与requireJS一起使用的AMD允许您指定和管理依赖项,因此如果有人使用requireJS,这允许他们非常轻松地导入此模块。这基本上是一种满足三种不同用例和框架的方法

    如果您没有使用node.js或requireJS,则无需重写任何内容,因为
    乱码
    将是附加到
    窗口的全局对象,因此您可以直接使用它


    有关更多信息,请查看GitHub,它有一系列模式(您看到的是
    nideAdapter.js
    amdWeb.js
    的简单变体的组合),还可以查看。

    …和同一篇文章()将Jaco Pretorius answer与Fentex I结合起来更具创造性:
    mynamespace=window.mynamespace | |{}
    然后
    mynamespace.GibberishAES=(函数(){//main code here..}())
    或者我可以做得更好???我以前没有使用过node.js或者requireJS,但是我可以说这个项目的目标是在客户端工作(和),也就是在用户的浏览器上做算术
    引用全局命名空间中的
    窗口
    ,谢谢提醒@当我第一次遇到这种模式时,centurian I也感到困惑。我有一个自己的开源项目,最近有一个贡献者修改了它以支持AMD。就在那时,我开始熟悉这种模式