簡體   English   中英

Javascript - 函數函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM