[英]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.