将附加parameter passing给Javascriptcallback函数

我需要在Node.JS应用程序中观察less量的目录:

function updated(event, filename){ log("CHANGED\t/share/channels/" + filename); } for(i in channels) fs.watch('share/channels/' + channels[i], {persistent: false}, updated); 

问题是,fs.watch只传递文件名到callback函数,而不包括它所在的目录。有没有办法,我可以以某种方式传递给更新()函数的额外参数,所以它知道文件在哪里?

我想我正在寻找类似于Python的functools.partial东西,如果有帮助的话。

你可以使用Function.bind

 function updated(extraInformation, event, filename) { log("CHANGED\t/share/channels/" + extraInformation + filename); } for(i in channels) fs.watch('share/channels/' + channels[i], {persistent: false}, updated.bind(null, 'wherever/it/is/')); 

您可以为每个迭代传递一个不同的函数:

 var getUpdatedFunction = function(folderName) { return function(event, filename) { log("CHANGED\t" + folderName + "/" + filename); }; }; for(i in channels) { foldername = 'share/channels/' + channels[i]; fs.watch(foldername, {persistent: false}, getUpdatedFunction(foldername)); } 

使用JS Bind的例子

Doc: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

提示,绑定参数发生在调用时间参数之前。

 my_hello = 'Hello!' my_world = { 'antartica': 'cold', } anonymous_callback = function (injected1, injected2, param1, param2) { param1 = param1 ? param1 : 'One'; param2 = param2 ? param2 : 'Two'; console.log('param1: (' + typeof(param1) + ') ' + param1) console.log('param2: (' + typeof(param2) + ') ' + param2) console.log('injected1: (' + typeof(injected1) + ') ' + injected1) console.log('injected2: (' + typeof(injected2) + ') ' + injected2) console.log(injected2) }.bind(this, my_hello, my_world) anonymous_callback('Param 1', 'Param 2') 

输出:

 param1: (string) Param 1 param2: (string) Param 2 injected1: (string) Hello! injected2: (object) [object Object] { antartica: 'cold' } 

你可以传递额外的callback

 function updated(channel, filename) { log('CHANGED\t ' + channel + '/' + filename); } for(i in channels) { channel = '/share/channels/' + channels[i]; fs.watch(channel, {persistent: false}, function (extra, event, filename) { updated(channel, filename); }); }