JavaScript如何多次调用带有参数的函数?

23

这不是完全必要的,我只是想简化我的代码。这就是我所拥有的:

   function fillWebsitePlaceFiller(number) {
     document.getElementById("placefillerWebsite" + number).innerHTML = placefillerWebsite;
   }

            fillWebsitePlaceFiller(1);
            fillWebsitePlaceFiller(2);
            fillWebsitePlaceFiller(3);
            fillWebsitePlaceFiller(4);
            fillWebsitePlaceFiller(5);
            fillWebsitePlaceFiller(6);
            fillWebsitePlaceFiller(7);

有没有办法我只调用一次函数,然后它可以使用每个参数运行7次?


12
一定是周五了,所有疯狂的循环解决方案都涌现出来了。 - Jim Rubenstein
哈哈 :) @JimRubenstein - eshellborn
6个回答

63

方法1 - 迭代

for (var i = 1; i < 8; i++) fillWebsitePlaceFilter(i);

方法二 - 递归

(function repeat(number) {
    fillWebsitePlaceFiller(number);
    if (number > 1) repeat(number - 1);
})(7);

第三种方法 - 函数对象应用

[1, 2, 3, 4, 5, 6, 7].forEach(fillWebsitePlaceFiller);

第四种方法 - 内部迭代

function fillWebsitePlaceFiller(times) {
    for (var number = 1; number <= times; number++) {
        document.getElementById("placefillerWebsite" + number).innerHTML = placefillerWebsite;
    }
}

方法5 - 扩展函数行为

Function.prototype.sequence = function(from, to) {
    for (var i = from; i <= to; i++) this.call(null, i);
};

fillWebsitePlaceFiller.sequence(1, 7);

方法6 - XPath(警告:未经测试)

var query = '//*[@id[starts-with(., "placefillerWebsite"]]';
var result = document.evaluate(query, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
while (var node = result.iterateNext()) node.innerHTML = placefillerWebsite;

方法七 - jQuery

$('[id^="placefillerWebsite"]').html(placefillerWebsite)

我建议使用一种方法,不要假设它们总是七个。


21

使用ES6可以更加优雅地解决这个问题:

[...Array(7)].forEach((_, i) => fillWebsitePlaceFiller(i + 1))

太棒了!谢谢你,你救了我的一天!;) - Isabella Monza

5
一个简单的for循环!
for (var i = 1; i <= 7; ++i) {
    fillWebsitePlaceFiller(i);
}

或者,同样容易的是,修改fillWebsitePlaceFiller函数以执行自己的for循环:
function fillWebsitePlaceFiller() {
    for (var i = 1; i <= 7; ++i) {
        document.getElementById("placefillerWebsite" + i).innerHTML = placefillerWebsite;
    }
}

3

类似于以下内容:

   function fillWebsitePlaceFiller(number) {
         for(i =0; i < number; i++)
         document.getElementById("placefillerWebsite" + i).innerHTML = placefillerWebsite;
       }

2
使用循环
function doTimes(number) {
    for (var i = 0; i < number; i++) {
        fillWebsitePlaceFiller(i); 
    }
}

doTimes(7);

-1

迭代一个函数多次的最佳且最简单的方法是使用qalllib

优点 - 1. 根据需求同步/异步迭代 2. 没有Promise违规 3. 像Promise.all一样返回所有结果的单个数组

示例:https://www.npmjs.com/package/qalllib

npm i qalllib
const qall = require('qalllib')

function doSomething(params)
    {
      return new Promise((resolve,reject){
        //operations
    })
    }

qall.qAsyncAll(doSomething, [arg1, 
 arg2,arg3],3)
.then((response)=>{
    console.log(response)
 }) //catchBlock

解释:

qall.qAsyncAll(functionName without brackets,     
arrayOfArguments, arrayOfArguments.length)

其他示例

示例

let _ = require('underscore')

let response = ['some data','other data'] 

return Promise.all(_.map(response, function (data) { return 
functionName(data) }))
.then((response)=>{
console.log(response)
})

结果

['response1','response2']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接