[英]Javascript functions as Arguments with Arguments
我想要的是加載多個文件。 這些文件都使用相同的功能加載,唯一不同的是文件名。 此函數應返回一個對象。 像這樣:
var files = [ loadFile("file1.txt"), loadFile("file2.txt"), loadFile("file3.txt") ];
// Example function
function loadFile( file_name ) {
return "loaded file " + file_name;
}
但是,當我運行它時,它將直接加載它。
var files = [ loadFile, loadFile, loadFile ];
// now please
for (var i = 0; i < files.length; i++) {
files[i]();
}
但是這樣我不能給它參數。 現在我可以創建這樣的填充函數,但是我可能有更好的方法來執行此操作...
function loadFile1() {
return loadFile( "file1.txt" );
}
如果可能,如何將Javascript函數作為帶參數的參數加載?
*做了一些測試。 我將使用bind()作為答案,因為這就是我想要的。 但我想提一下Stuart的答案,我一定會牢記將來的用途。 MoeSattler & vlaz謝謝你們展示了其他好的方法!
不能這樣做:
// Example function
function loadFile( file_name ) {
return "loaded file " + file_name;
}
var files = ["file1.txt", "file2.txt", "file3.txt"];
for (i = 0; i < files.length; i++) {
loadFile(files[i]);
}
map
怎么樣?
function loadFile( file_name ) { return "loaded file " + file_name; } const fileNames = ['file1.txt', 'file2.txt', 'file3.txt'] const files = fileNames.map(loadFile) console.log(files)
您可以使用Function#bind
將參數綁定到函數,然后在不使用參數的情況下調用。
的
bind()
方法創建一個新的功能,調用它時,具有其this
關鍵字設置為所提供的值,與前述的當新功能被調用任何設置參數給定的序列。
function loadFile( file_name ) { return "loaded file " + file_name; } var files = [ loadFile.bind(null, "file1.txt"), loadFile.bind(null, "file2.txt"), loadFile.bind(null, "file3.txt") ]; files.forEach(function (a) { console.log(a()); });
選項1使用所謂的thunk-它只是一個不帶任何參數並在執行時返回值的函數。 這對於以后返回一些東西很有用。 實際上,您確實具有loadFile1
的示例,但是可以對其進行概括。
function loadFileLater(fileName) {
return function() {
loadFile( fileName );
}
}
function loadFileLater(fileName) {
return loadFile.bind(null, fileName);
}
另外,您可以翻轉它,而不是擁有需要值的函數數組,而可以擁有一個值數組,在其中對每個對象執行一個函數
function loadFile( file_name ) { return "loaded file " + file_name; } var filesNames = [ "file1.txt", "file2.txt", "file3.txt", "file4.txt" ] var files = filesNames.map(loadFile) console.log(files);
bind
將成為您最好的朋友。
通常, bind
用於為函數分配上下文(即: var myBoundFunc = myFunc.bind(myObj)
將確保通過myBoundFunc
調用MyFunc
this
任何引用都指向myObj
),但是bind具有以下優點:還能夠存儲參數來調用myFunc
。
因此,在您的情況下:
var files = [ loadFile.bind(this, "file1.txt"), loadFile.bind(this, "file2.txt"), loadFile.bind(this, "file3.txt") ];
其中this
可以是任何上下文,並且當得到的函數(即,每一個參數,則使用后files[0]()
被調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.