[英]Javascript - functions on functions?
我最近為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 _;
};
}
正如此使用:
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);
});
};
。
。
。
這些功能是在功能上嗎?!
他們如何相互了解?
這個函數的第7行是什么'_'(下划線)?
有人可以幫我解釋一下那邊的東西嗎? :)
函數確實可以返回函數。 拿這個功能,例如:
function func(text) {
alert(text);
return func;
}
顯然,任何func
調用的返回值都將是func
,所以你可以像這樣使用它:
func("hello")("world");
......你會收到兩個警告:首先是“你好”,然后是“世界”。
接下來,有一個叫做命名函數表達式的東西。 您可能在以前看過匿名函數表達式:
doSomething(thing, function(err) {
// operation completed or something
});
當然,對於簡單的事情來說,這是很好的,但有時你希望函數有一個名稱,以便它可以引用自身。 正如Kolink所提到的,如果你只是想要遞歸,那就是arguments.callee
,它指的是當前正在執行的函數,但還有另一種方法:你可以給函數一個名稱只在函數內可見,同時仍然是函數表達式:
doSomething(thing, function myself(err) {
// ^^^^^^
// now I can refer to myself as myself!
});
下划線是有效的標識符,因此它們基本上只是以難以理解的方式組合這些技術。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.