[英]Is there an equivalent of std::bind in javascript or node.js?
這是一個很長的鏡頭,但我想知道在javascript或node.js中是否存在C ++ 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)
這將導致一個函數接受一個參數(在我的情況下為'結果'),我可以傳遞而不是匿名回調。 現在我正在為我的快遞應用程序中的每個路由復制匿名函數中的所有代碼。
雖然它存在,但我更傾向於使用閉包:
function writeResponse(res) {
return function(result) {
res.write(JSON.stringify(result));
res.end();
};
}
// and then...
dbaccess.exec(query, writeResponse(res));
如果我很清楚你想要做什么,我應該指向Function.prototype.bind方法。 它像你描述的那樣工作:
app.get('/sites', function(req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
dbaccess.exec(query, writeResponse.bind(null, res));
});
盡管與STL
的bind
函數略有不同,但您可以使用<function>.bind
,它是JavaScript中函數原型的一部分。
bind
方法返回一個新創建的function
對象(不要忘記function
是JavaScript中的第一個公民,並且是從Function
原型開始構建的),它接受N減去M個參數(在JavaScript中這確實是一個弱約束,它會接受你傳遞的參數數量很多,但不能保證它們會被使用),其中N是接受參數的原始數量,而M是綁定參數。
主要區別在於bind
還接受作為第一個參數的作用域對象,該對象將在新創建的函數本身中作為this
引用使用,因此您可以在執行期間逐字地更改並注入this
引用。
在這里你可以找到bind
的文檔。
正如某人所提到的,您幾乎可以在所有可以使用bind的情況下依賴閉包來獲取目標。
不確定它們是否在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);
})
});
雖然這一個具有this
通過定義.exec()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.