我最近遇到了一些node.js代码,它在函数调用后立即用括号括起来的匿名函数。有人可以向我解释一下这里的语法是什么吗?
var fs = require('./continuable-style-fs');
fs.readFile('mydata.txt')(function (text) {
// Do something
console.log(text);
}, function (error) {
// Handle error
throw error
});
答案 0 :(得分:2)
continuable-style-fs
返回返回函数的内置fs
方法的版本,而不是接受回调作为参数。
考虑到这一点,回调被传递给fs.readFile()
返回的函数。然后在读取完成时调用回调,就像原始fs.readFile()
那样。
查看the code for continuable-style-fs时,传递的第二个函数是接收错误的函数。这比#"错误优先"更像是承诺。异步节点核心方法的回调方法。
答案 1 :(得分:0)
这意味着fs.readFile('mydata.txt')
返回一个立即调用的函数。
这样看起来更有意义......
var fs = require('./continuable-style-fs');
var fn = fs.readFile('mydata.txt');
fn(function (text) {
// Do something
console.log(text);
}, function (error) {
// Handle error
throw error
});
答案 2 :(得分:0)
如果没有你发布函数require(),它有点难以分辨,因为我们不确切地知道返回的是什么。如果你提供更多信息,我相信我能搞清楚,否则我现在就会对答案略微猜测。好的,所以在这里:
在JavaScript中,您可以使用带参数的匿名函数。您可以按如下方式启动该功能:(function (variable){
...
...
})(myVariable);
因此,如果required()返回一个对象,那么fs.readFile()将是一个附加到该对象的方法(通过原型设计)。在这种情况下,它看起来像是一个方法,它本身返回一个匿名函数,然后从//Do something
部分接收变量,或者它将从//Handle error
接收错误/变量
所以最后你还有
fs.readFile('mydata.txt')(someVariable);
如果readFile返回匿名函数,那么它将如下所示:
(function foo (variable){})(someVariable);
这作为另一个答案提及只是一种使用回调的略有不同的方法。我希望这有帮助,并且很清楚。
答案 3 :(得分:0)
这是怎么回事,以下代码:
fs.readFile('mydata.txt')(function (text) {
// Do something
console.log(text);
}, function (error) {
// Handle error
throw error
});
可以翻译成:
var file_reader = fs.readFile('mydata.txt');
file_reader(function (text) {
// Do something
console.log(text);
}, function (error) {
// Handle error
throw error
});
然后可以将其转换为:
function read_file_handler (text) {
// Do something
console.log(text);
}
function file_error_handler (error) {
// Handle error
throw error
}
var file_reader = fs.readFile('mydata.txt');
file_reader(read_file_handler, file_error_handler);
基本上,javascript允许您:
将功能视为数据
立即使用任何表达式或函数调用的结果
2号很有意思。因为它允许你做这样的事情:
function foo () {
return "a,b,c";
}
var abc_array = foo().split(',');
请注意,在上面的示例中,split
是String
方法,但我们可以在foo()
之后立即调用它,因为它会返回一个字符串。
同样我们可以这样做:
function foo () {
return function () {console.log('hello')}
}
foo()();
这里调用foo()
会返回一个函数。我们可以将它分配给变量并调用它,但我们也可以像上面那样立即调用它。