我打开了一个名为 Jibberish ( https://github.com/mdp/gibberish-aes ) 的 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"
指的是function size()
定义为函数表达式:
size = function(newsize){...}
我什至可以通过调用所有返回的函数 aspublic
和其余的 as来回忆有关这种方法的私有和公共函数的所有讨论,private
但有些事情让我很困惑:
为什么外部匿名函数有参数,它们将在哪里使用?
而不是使用
(function(){//put my code here...}());
作者(function(root, factory){//some code...}(this, function(){//main code here...}));
,这是为什么呢?在问题 (2) 上,我可以看到两个参数
this
并function(){//main code here...}
作为参数传递给外部匿名函数来代替root
andfactory
。所以,root
变成了this
!但是,现在this
指的是哪里?也许我们可以更好地重写这一切?我刚刚阅读了如何在 JavaScript 中声明命名空间?我发现 Jaco Pretorius 的回答非常棒,我可以重写这个并将其添加到我的命名空间中,如下所示:
(函数(myGibberishAES){
//这里的主要代码...
}(window.myGibberishAES = window.myGibberishAES || {}));
可以接受的编码标准吗?
谢谢!