2016-12-08 79 views
1

我想要的是加載多個文件。這些文件全部使用相同的函數來加載,唯一不同的是文件名。這個函數應該返回一個對象。這樣的事情:Javascript函數作爲帶參數的參數

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's答案,我一定會記住將來使用。 MoeSattler & vlaz謝謝大家展示其他好做法!

+3

要麼使用'綁定()',或進行另一個功能或λ。 – SLaks

+1

*「但我可能有更好的方法來做到這一點」*如果您認爲'.bind'是更好的方法,那麼是的。否則,不。 –

回答

2

您可以使用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()); 
 
});

+0

請小心@flummox,這是一個非常冒險的解決方案,不是慣用的,很難閱讀。請確保你得到堅實的JS /編程潛水之前的基礎太深 – MoeSattler

5

廣東話你這樣做:

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

雖然bind是完全可以接受的(就像我和Nina的答案一樣),這是一個** FAR **更好的解決方案。唯一的情況是'bind'優於這個,如果函數被應用到'files'中的每個條目是不同的。 –

+2

再也沒有理由使用for循環了。 map/forEach that stuff :) – MoeSattler

+3

確實@MoeSattler,但是因爲OP已經在使用這種類型的代碼,我以相同的樣式回答(沒有混淆) – Stuart

1

bind將是在這裏你最好的朋友。

通常bind用於指定上下文的功能(即:var myBoundFunc = myFunc.bind(myObj)將確保當通過myBoundFunc被叫到MyFuncthis任何引用將指向myObj),但結合有還能夠額外的獎勵存儲參數以呼叫myFunc

所以你的情況:

var files = [ loadFile.bind(this, "file1.txt"), loadFile.bind(this, "file2.txt"), loadFile.bind(this, "file3.txt") ]; 

哪裏this可以是任何上下文,每次吵架後,對所得功能(即files[0]())被調用時使用。

2

選項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 = [ 
 
\t "file1.txt", 
 
\t "file2.txt", 
 
\t "file3.txt", 
 
\t "file4.txt" 
 
] 
 

 
var files = filesNames.map(loadFile) 
 

 
console.log(files);

就你而言,你很可能會使用.forEach而不是.map,但它是完全相同的原理。

3

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)

+0

您的地圖鏈接轉到西班牙語版 – Flummox

+0

謝謝!修正:) – MoeSattler