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 来获得目标.
希望不大,但我想知道 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 来获得目标.