Javascript用作带参数的参数

时间:2016-12-08 15:16:45

标签: 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&amp; vlaz谢谢你们展示其他好方法!

5 个答案:

答案 0 :(得分:6)

你做不到:

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

答案 1 :(得分:3)

map怎么样?

&#13;
&#13;
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)
&#13;
&#13;
&#13;

答案 2 :(得分:2)

您可以使用Function#bind将参数绑定到函数,然后在没有参数的情况下调用。

  

bind() 方法创建一个新函数,在调用时,将其this关键字设置为提供的值,并在给定的任何参数之前提供给定的参数序列调用新函数。

&#13;
&#13;
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());
});
&#13;
&#13;
&#13;

答案 3 :(得分: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 = [
	"file1.txt",
	"file2.txt",
	"file3.txt",
	"file4.txt"
]

var files = filesNames.map(loadFile)

console.log(files);

在您的情况下,您最有可能使用.forEach而不是.map,但这是完全相同的原则。

答案 4 :(得分:1)

bind将成为你最好的朋友。

通常bind用于为函数分配上下文(即:var myBoundFunc = myFunc.bind(myObj)将通过{{1}确保this中对MyFunc的任何引用将指向myBoundFunc),但绑定还有额外的好处,即能够存储参数以调用myObj

所以在你的情况下:

myFunc

var files = [ loadFile.bind(this, "file1.txt"), loadFile.bind(this, "file2.txt"), loadFile.bind(this, "file3.txt") ]; 可以是任何上下文,并且在调用结果函数(即this)时使用后面的每个参数。