簡體   English   中英

在javascript或node.js中是否有等效的std :: bind?

[英]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));
});

盡管與STLbind函數略有不同,但您可以使用<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()

它確實存在,有兩種方法。 打電話申請略有不同。

有一個綁定的方法為好,但它確實不同的事物(值改變this調用函數時)。

沒有這樣的事,作為一個“函數指針”我想你所需要的就是嘩眾取寵

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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