【问题标题】:Is there an equivalent of std::bind in javascript or node.js?javascript 或 node.js 中是否有 std::bind 的等价物?
【发布时间】:2016-01-19 04:40:12
【问题描述】:

这是一个很长的镜头,但我想知道是否在 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)

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

【问题讨论】:

标签: javascript node.js stdbind


【解决方案1】:

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

function writeResponse(res) {

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

【讨论】:

  • 这太好了,谢谢。我也发现它比使用 bind 更具可读性。
【解决方案2】:

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

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

【讨论】:

  • 确实是我要找的,虽然看起来你应该通过undefined而不是null
  • 这更像是一个约定而不是一个规则,但如果你传递的是 null 对象,你就是在说:那个参数应该是 'nothing'。
【解决方案3】:

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

bind 方法返回一个新创建的 function 对象(不要忘记 functions 是 JavaScript 中的第一个公民,并且是从 Function 原型开始构建的),它接受 N 减去 M 参数(在 JavaScript 中,这确实是一个弱约束,它会接受与传递它一样多的参数,但不能保证它们会被使用),其中 N 是接受的参数的原始数量,而 M 是绑定的。

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

Here你可以找到bind的文档。

正如某人所说,在几乎所有可以使用 bind 的情况下,您也可以依靠 闭包 来获得目标。

【讨论】:

    【解决方案4】:

    不确定 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

    【讨论】:

      【解决方案5】:

      确实存在,有两种方法。 Callapply 略有不同。

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

      没有“函数指针”之类的东西,我认为您需要的是currying

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

      【讨论】:

      • 这似乎不是 OP 想要的。并且可以在JS中传递函数,函数是对象,所有对象都是引用传递。
      • “传递一个接受一个参数的函数指针”对我来说听起来像是他想从一个闭包中生成一个函数
      • @LuisSieira 听起来他们大多真的理解在 JavaScript 中描述函数时使用的正确术语。
      • 显然,但我从问题中了解到的是“我想将一个函数作为参数传递,稍后将使用一些尚未生成的参数执行”。这里->“这将导致一个函数接受一个参数(在我的例子中是'结果'),我可以传递它而不是匿名回调”
      • 您错过了传递给您要返回的函数的参数。您需要通过绑定args 加入他们。
      猜你喜欢
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 2012-04-29
      相关资源
      最近更新 更多