将函数调用的结果作为javascript / node.js中的函数调用

时间:2014-09-11 02:08:11

标签: javascript node.js anonymous-function

我最近遇到了一些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
});

4 个答案:

答案 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允许您:

  1. 将功能视为数据

  2. 立即使用任何表达式或函数调用的结果

  3. 2号很有意思。因为它允许你做这样的事情:

    function foo () {
        return "a,b,c";
    }
    var abc_array = foo().split(',');
    

    请注意,在上面的示例中,splitString方法,但我们可以在foo()之后立即调用它,因为它会返回一个字符串。

    同样我们可以这样做:

    function foo () {
        return function () {console.log('hello')}
    }
    foo()();
    

    这里调用foo()会返回一个函数。我们可以将它分配给变量并调用它,但我们也可以像上面那样立即调用它。