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)

这将导致一个函数接受一个参数(在我的例子中是 'result'),我可以传递该参数而不是匿名回调。 现在我正在为我的 express 应用程序中的每条路线复制匿名函数中的所有代码。

确实存在,有两种方法。 Call and apply 略有不同。

还有一个 bind 方法,但它做了不同的事情(调用函数时更改 this 的值)。

没有 'function pointer' 我想你需要的是 currying:

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

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

如果我很清楚你想做什么,我应该指出 Function.prototype.bind 方法。它像您描述的那样工作:

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

虽然它存在,但我更倾向于用闭包来做:

function writeResponse(res) {

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

不确定 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() 定义。

尽管与 STL 中的 bind 函数略有不同,但您可以使用 <function>.bind,这是 [=46= 中函数原型的一部分].

bind 方法 returns 新创建的 function 对象(不要忘记 function 是 JavaScript 中的第一批公民,并且是建立起来的从 Function 原型开始)接受 N 减去 M 参数(在 JavaScript 中,这确实是一个弱约束,它将永远接受你传递的参数,但不能保证它们将被使用),其中 N 是接受参数的原始数量,而 M 是绑定的。

主要区别在于 bind 也接受一个 scope 对象作为第一个参数,该对象将在新创建的函数本身中作为 this 引用,因此您可以在执行期间逐字更改和注入 this 引用。

Here 你可以找到 bind.

的文档

正如某人所提到的,在几乎所有可以使用 bind 的情况下,您也可以依靠 closures 来获得目标.