2015-10-20 61 views
5

這是一個長鏡頭,但我想知道,如果有這樣的事情作爲C++的std ::綁定在JavaScript或Node.js的?此處,我感到綁定需要的例子:在javascript或node.js中是否存在等價的std :: bind?

var writeResponse = function(response, result) { 
    response.write(JSON.stringify(result)); 
    response.end(); 
} 


app.get('/sites', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    dbaccess.exec(query, function(result) { 
     res.write(JSON.stringify(result)); 
     res.end(); 
    }); 
}); 

不是傳遞迴調dbaccesss.exec的,我想傳遞一個函數指針,它有一個參數。在C++中我會通過這樣的:

std::bind(writeResponse, res) 

這將導致,它有一個參數(「結果」在我的情況)的函數,我能通過,而不是匿名回調。 現在我重複在匿名函數所有的代碼在我的快遞應用每路線。

+1

[Function.prototype.bind](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind)? – Oka

回答

4

雖然它的存在,我會更傾向於與閉合做到這一點:

function writeResponse(res) { 

    return function(result) { 
     res.write(JSON.stringify(result)); 
     res.end(); 
    }; 
} 
// and then... 
dbaccess.exec(query, writeResponse(res)); 
+0

這是偉大的,謝謝。我也發現它比使用綁定更可讀。 – cocheci

-1

它確實存在,有兩種方法。 Callapply,略有不同。

還有一個bind方法,但它做了不同的事情(調用函數時更改了this的值)。

沒有這樣的事,作爲一個「函數指針」我想你所需要的就是currying

function currier(that, fn) { 
    var args = [].slice.call(arguments, 2); 

    return function() { 
    return fn.apply(that, args); 
    } 
} 
+0

似乎這不是什麼OP要不惜一切。你可以在JS中傳遞函數,函數是對象,並且所有對象都通過引用傳遞。 –

+0

「傳遞一個函數指針,它接受一個參數」聽起來像他想要從閉包中生成函數 –

+0

@LuisSieira它大部分聽起來像他們不真正理解在JavaScript中描述函數時使用的正確術語。 – Oka

3

如果我明白你想做好什麼,我應該指向 Function.prototype.bind方法。它的工作原理就像你描述:

app.get('/sites', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    dbaccess.exec(query, writeResponse.bind(null, res)); 
}); 
+0

事實上,這就是我一直在尋找,但它看起來像你應該通過'undefined'而不是'null'? – cocheci

+1

這更像是一個慣例而不是一個規則,但是如果你傳遞了空對象,你就會說:這個爭論應該是'沒有'。 – Microfed

1

不知道,如果他們要的NodeJS支持還,但如果所以,你也可以輕鬆地使用胖箭頭功能。

app.get('/sites', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    dbaccess.exec(query, r => writeResponse(res, r)) 
}); 

它們還保留詞法this的值,這在需要時很好。

這大致相當於此:

app.get('/sites', function(req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    dbaccess.exec(query, function(r) { 
     return writeResponse(res, r); 
    }) 
}); 

,雖然這其中有由.exec()定義的this

+0

的確如此,謝謝。 – cocheci

3

儘管與STL中的bind函數略有不同,您可以使用<function>.bind,它是JavaScript中函數原型的一部分。

bind方法返回一個新創建的function對象(不要忘記,function s爲第一公民在JavaScript中,並建立了從Function原型開始)接受ň減去中號參數(在JavaScript中,這是一個弱約束的確,它永遠不會接受盡可能多的參數傳遞給它,但沒有保證,他們將使用),其中ñ是接受參數的原號碼,而中號是必然的。

的主要區別在於,bind也接受作爲第一個參數範圍對象,這將是可得自新創建的功能本身作爲this參考內,這樣就可以真正地改變和執行期間注入this參考。

Here,你可以找到bind的文檔。

正如有人所說,你還可以依靠關閉讓你的目標在幾乎所有情況下,你可以使用綁定

相關問題