在javascript或node.js中是否有等价的std :: bind?
这是一个远射,但我想知道是否有像javascript或node.js中的C + + std ::绑定这样的事情? 这里是我觉得需要一个绑定的例子:
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(); }); });
我不想将callback传递给dbaccesss.exec,而是想传递一个带有一个参数的函数指针。 在C ++中,我会通过这个:
std::bind(writeResponse, res)
这将导致一个函数,我需要一个参数(我的结果),我可以通过,而不是匿名callback。 现在我正在复制我的快速应用程序中每个路由的匿名函数中的所有代码。
当它存在的时候,我更倾向于用封闭的方式来做:
function writeResponse(res) { return function(result) { res.write(JSON.stringify(result)); res.end(); }; } // and then... dbaccess.exec(query, writeResponse(res));
如果我很好地理解你想要做什么,我应该指向Function.prototype.bind方法。 它像你所描述的那样工作:
app.get('/sites', function(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); dbaccess.exec(query, writeResponse.bind(null, res)); });
即使与STL
的bind
函数稍有不同,也可以使用<function>.bind
,它是JavaScript中函数原型的一部分。
bind
方法返回一个新创build的function
对象(不要忘记, function
s是JavaScript中的第一个公民,并且是从Function
原型开始构build的),它接受N减M参数(在JavaScript中,这确实是一个弱约束,它会接受尽可能多的参数,但是不能保证它们会被使用),其中N是接受参数的原始数量,而M是绑定参数。
主要区别在于bind
还接受作为第一个参数的作用域对象,这个对象在新创build的函数本身作为this
引用可用,因此您可以在执行过程中从字面上更改并注入this
引用。
在这里你可以findbind
的文档。
正如某人所说的,在几乎所有可以使用绑定的情况下,您也可以依靠closures来获得目标。
不知道它们是否在NodeJS中受支持,但如果是这样的话,你也可以使用胖箭头function。
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
。
它确实存在,有两种方法。 打电话和申请哪个稍有不同。
还有一个绑定方法,但它做了一个不同的事情(当调用一个函数时改变这个值)。
没有“函数指针”这样的东西我想你在这里需要的是currying :
function currier(that, fn) { var args = [].slice.call(arguments, 2); return function() { return fn.apply(that, args); } }