Ale*_*Zak 3 javascript node.js kue
我最近为node.js使用了一个名为Kue的漂亮库.
我想更好地理解发生了什么,所以我开始阅读代码......
我偶然发现了一段代码,我的脑海里出现了"WTF !!?!@ $ @!$"......
这是代码:
function get(obj) {
var pending = 0
, res = {}
, callback
, done;
return function _(arg){
switch (typeof arg) {
case 'function':
callback = arg;
break;
case 'string':
++pending;
obj[arg](function(err, val){
if (done) return;
if (err) return done = true, callback(err);
res[arg] = val;
--pending || callback(null, res);
});
break;
}
return _;
};
}
Run Code Online (Sandbox Code Playgroud)
正如此使用:
exports.stats = function(req, res){
get(queue)
('inactiveCount')
('completeCount')
('activeCount')
('failedCount')
('delayedCount')
('workTime')
(function(err, obj){
if (err) return res.send({ error: err.message });
res.send(obj);
});
};
Run Code Online (Sandbox Code Playgroud)
.
.
.
这些功能是在功能上吗?!
他们如何相互了解?
这个函数的第7行是什么'_'(下划线)?
有人可以帮我解释一下那边的东西吗?:)
函数确实可以返回函数.拿这个功能,例如:
function func(text) {
alert(text);
return func;
}
Run Code Online (Sandbox Code Playgroud)
显然,任何调用的返回值都func将是func,所以你可以像这样使用它:
func("hello")("world");
Run Code Online (Sandbox Code Playgroud)
......你会收到两个警告:首先是"你好",然后是"世界".
接下来,有一个叫做命名函数表达式的东西.您可能在以前看过匿名函数表达式:
doSomething(thing, function(err) {
// operation completed or something
});
Run Code Online (Sandbox Code Playgroud)
当然,对于简单的事情来说,这是很好的,但有时你希望函数有一个名称,以便它可以引用自身.正如Kolink所提到的,如果你只是想要递归,那么arguments.callee,它指的是当前正在执行的函数,但还有另一种方法:你可以给函数一个只在函数中可见的名称,同时仍然是函数表达式:
doSomething(thing, function myself(err) {
// ^^^^^^
// now I can refer to myself as myself!
});
Run Code Online (Sandbox Code Playgroud)
下划线是有效的标识符,因此它们基本上只是以难以理解的方式组合这些技术.