将函数调用的结果作为javascript/node.js中的函数调用
我最近遇到了一些node.js代码,它在函数调用后立即在括号中包含一个匿名函数。有人请向我解释这里的语法是怎么回事?将函数调用的结果作为javascript/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
});
continuable-style-fs
正在返回的内置fs
方法,返回而不是接受一个回调作为参数的函数的版本。
考虑到这一点,回调被传递给由fs.readFile()
返回的函数。当读取完成后,回调就会被调用,就像原来的fs.readFile()
一样。
当看到the code for continuable-style-fs时,传递的第二个函数是接收错误的函数。这比异步节点核心方法的“错误优先”回调方式更具承诺性。
这意味着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
});
如果您没有发布函数require(),有点难以分辨,因为我们不确切知道返回结果。如果你提供了更多的信息,我相信我可以搞清楚,否则我现在稍微猜测答案。好,所以在这里:
在JavaScript中,你可以有一个匿名函数,它需要一个参数。您可以按如下启动该功能:
(function (variable){
...
...
})(myVariable);
所以,如果需要()返回一个对象,然后fs.readFile()将连接到该对象(通过原型)的方法。在这种情况下,它看起来像它本身返回一个匿名函数的方法然后将从//Do something
部分接受或变量,否则将收到错误/变量从//Handle error
所以,到底你有
fs.readFile('mydata.txt')(someVariable);
如果哪个不READFILE返回一个匿名函数,那么它看起来像:
(function foo (variable){})(someVariable);
这是另一种答案提到仅仅是一个稍微不同的方法使用回调。我希望这有帮助,而且很明确。
发生了什么事是这样,下面的代码:
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()
返回的功能。我们可以将它分配给一个变量并调用它,但我们也可以像上面那样立即调用它。
如果我的答案是不说清楚,你应该阅读以下为他在谈论同样的事情,更简洁它MSCDEX的答案。 – QuietOmen 2014-09-11 02:29:15
我从[这里](http://howtonode.org/control-flow-part-ii)博客条目的代码。它是在谈论节点旧诺基系统。我遵循你所说的话,直到函数被评估为一些变量。我不明白的是该变量在哪里被使用,以什么名字存储?在上面的例子中,'fs.readFile('mydata.txt')'的返回值是否会作为参数传递给匿名函数? – kurofune 2014-09-11 02:50:02