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

时间:2015-10-20 13:30:24

标签: javascript node.js stdbind

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

这将导致一个函数带有一个参数(在我的情况下为'结果'),我可以传递而不是匿名回调。 现在,我正在为我的快递应用程序中的每条路线复制匿名函数中的所有代码。

5 个答案:

答案 0 :(得分:4)

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

function writeResponse(res) {

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

答案 1 :(得分:3)

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

>> find(n(m) == 1)
ans =
     2     4

答案 2 :(得分:3)

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

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

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

Here您可以找到bind的文档。

如某人所述,您也可以依赖闭包来获取目标,几乎可以使用 bind

答案 3 :(得分: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);
    })
});

虽然这个this.exec()定义。

答案 4 :(得分:-1)

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

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

没有&#39;功能指针&#39;我认为你需要的是currying

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

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