重写并向我的命名空间中添加一个javascript库
我打开了一个名为Jibberish()的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) {
(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…}))代码>,为什么会这样
this
和function(){//main code here…}
作为参数传递给外部匿名函数,而不是root
和factory
。所以,root
变成了this
!但是,现在这个指的是哪里exports
函数,那么我们可能使用的是node.jsdefine
的函数,并且它有一个名为amd
的属性,那么这意味着我们正在使用amdwindow
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。就在那时,我开始熟悉这种模式