【发布时间】:2013-04-13 03:56:27
【问题描述】:
我打开了一个名为 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");
我可以看到一个最外层的自执行函数在代码末尾返回一个对象,它实际上是匿名的(!),并且这个对象的成员是在 self-执行函数so,属性"size"引用function size()定义为函数表达式:
size = function(newsize){...}
我什至可以通过将所有返回的函数调用为public 并将其余函数调用为private 来回忆有关这种方法的私有和公共函数的所有讨论,但有些事情让我很困惑:
为什么外部匿名函数有参数,它们将在哪里使用?
作者使用
(function(root, factory){//some code...}(this, function(){//main code here...}));而不是(function(){//put my code here...}());,这是为什么呢?关于问题 (2) 我可以看到两个参数
this和function(){//main code here...}作为参数传递给外部匿名函数,而不是root和factory。所以,root变成了this!但是,现在this指的是哪里?-
也许我们可以更好地重写这一切? 我刚刚阅读了How do I declare a namespace in JavaScript?,我发现 Jaco Pretorius 的答案非常棒,我可以重写这个并将其添加到 my namespace 中,如下所示:
(函数(myGibberishAES){
//这里的主要代码...
}(window.myGibberishAES = window.myGibberishAES || {}));
这符合可接受的编码标准吗?
谢谢!
【问题讨论】:
-
...在同一个帖子 (stackoverflow.com/questions/881515/…) 将 Jaco Pretorius 的答案与 Fentex 结合起来,我可以更有创意:
mynamespace = window.mynamespace || {};然后mynamespace.GibberishAES = (function(){//main code here..}());或者我可以做得更好???
标签: javascript javascript-namespaces