繁体   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