这是一个很长的镜头,但我想知道在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)
这将导致一个函数带有一个参数(在我的情况下为'结果'),我可以传递而不是匿名回调。 现在,我正在为我的快递应用程序中的每条路线复制匿名函数中的所有代码。
答案 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)