簡體   English   中英

JavaScript用作帶參數的參數

[英]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的答案,我一定會牢記將來的用途。 MoeSattlervlaz謝謝你們展示了其他好的方法!

不能這樣做:

// 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.prototype.bind()

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

在您的情況下,您很可能會使用.forEach而不是.map但這是完全相同的原理。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM