2014-09-11 72 views
0

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

回答

2

continuable-style-fs正在返回的內置fs方法,返回而不是接受一個回調作爲參數的函數的版本。

考慮到這一點,回調被傳遞給由fs.readFile()返回的函數。當讀取完成後,回調就會被調用,就像原來的fs.readFile()一樣。

當看到the code for continuable-style-fs時,傳遞的第二個函數是接收錯誤的函數。這比異步節點核心方法的「錯誤優先」回調方式更具承諾性。

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 
}); 
0

如果您沒有發佈函數require(),有點難以分辨,因爲我們不確切知道返回結果。如果你提供了更多的信息,我相信我可以搞清楚,否則我現在稍微猜測答案。好,所以在這裏:

在JavaScript中,你可以有一個匿名函數,它需要一個參數。您可以按如下啓動該功能:

(function (variable){ 
... 
... 
})(myVariable); 

所以,如果需要()返回一個對象,然後fs.readFile()將連接到該對象(通過原型)的方法。在這種情況下,它看起來像它本身返回一個匿名函數的方法然後將從//Do something部分接受或變量,否則將收到錯誤/變量從//Handle error

所以,到底你有

fs.readFile('mydata.txt')(someVariable); 

如果哪個不READFILE返回一個匿名函數,那麼它看起來像:

(function foo (variable){})(someVariable); 

這是另一種答案提到僅僅是一個稍微不同的方法使用回調。我希望這有幫助,而且很明確。

+0

如果我的答案是不說清楚,你應該閱讀以下爲他在談論同樣的事情,更簡潔它MSCDEX的答案。 – QuietOmen 2014-09-11 02:29:15

+0

我從[這裏](http://howtonode.org/control-flow-part-ii)博客條目的代碼。它是在談論節點舊諾基系統。我遵循你所說的話,直到函數被評估爲一些變量。我不明白的是該變量在哪裏被使用,以什麼名字存儲?在上面的例子中,'fs.readFile('mydata.txt')'的返回值是否會作爲參數傳遞給匿名函數? – kurofune 2014-09-11 02:50:02

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. 立即使用任何表達或功能調用

數2是有趣的結果。因爲它可以讓你做這樣的事情:

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

注意,在上面split的例子是String方法,但我們不能因爲它返回一個字符串foo()後立即調用它。

同樣,我們可以做到這一點:

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

這裏呼籲foo()返回的功能。我們可以將它分配給一個變量並調用它,但我們也可以像上面那樣立即調用它。