2013-04-22 72 views
3

我最近使用了一個名爲Kue的node.js的庫。
我希望得到一些更好的理解這是怎麼回事,所以我開始閱讀我無意中發現了一塊代碼的代碼......Javascript - 函數的功能?

,我的腦子裏「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行的'_'(下劃線)是什麼?

有人可以幫我解釋一下那邊有什麼? :)

+0

在Javascript中,你可以做到這一點。你也可以將一個函數傳遞給另一個函數,就像其他語言的變量一樣。 – 2013-04-22 00:11:08

+0

'_'是函數名稱。它就像任何其他函數名稱一樣,只是一個非常簡短的名字。 – Pokey 2013-04-22 00:17:32

回答

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! 
}); 

下劃線是一個有效的標識符,所以它們基本上只是以難以理解的方式組合這些技術。

+0

「沒有辦法從函數內引用該函數」 - 不正確。 'arguments.callee'。 – 2013-04-22 00:21:39

+0

@Kolink:你說得對,我忘記了。我會編輯。 – icktoofay 2013-04-22 00:22:25

+0

非常感謝!現在更好理解......:P – 2013-04-22 16:51:23