使用不同的参数调用相同的函数两次

时间:2015-05-01 14:03:24

标签: javascript function parameters

Supose我有一个函数调用相同的函数两次,每次都有不同的参数,有些像这样:

function one(){
     two(a,b);
     two(c,d);  
}

当我调用第一个函数时,只执行第一个函数2,而不执行第二个函数。有没有办法只在Javascript中执行此操作? (不是Jquery)

这是cuestion中的代码(是一个基于文本的小RPG)

window.onload = init;

function init(){

    document.onmousedown = function disableselect(e) {return false;};

 /*ELEMENTS*/

    var monsterPicture = document.createElement('div');
    monsterPicture.setAttribute('class', 'monsterPicture');
    monsterPicture.style.position = 'absolute';
    monsterPicture.style.top = '0';
    monsterPicture.style.right = '0';
    monsterPicture.style.bottom = '0';
    monsterPicture.style.left = '0';
    monsterPicture.style.height = '350px';
    monsterPicture.style.width = '350px';
    monsterPicture.style.margin = 'auto';
    monsterPicture.style.backgroundColor = 'grey';
    document.body.appendChild(monsterPicture);

    var textInfo = document.createElement('textarea');
    textInfo.setAttribute('class', 'textInfo');
    textInfo.style.position = 'absolute';
    textInfo.style.top = '0';
    textInfo.style.bottom = '0';
    textInfo.style.right = '0';
    textInfo.style.height = '350px';
    textInfo.style.width = '250px';
    textInfo.style.margin = 'auto 50px auto auto';
    textInfo.style.backgroundColor = 'white';
    textInfo.style.overflowY = 'hidden';
    textInfo.style.resize = 'none';
    textInfo.readOnly = 'true';
    textInfo.disabled = 'true';
    textInfo.style.cursor = "default";
    document.body.appendChild(textInfo);

    var statsArea = document.createElement('div');
    statsArea.setAttribute('class', 'statsArea');
    statsArea.style.position = 'absolute';
    statsArea.style.top = '0';
    statsArea.style.top = '0';
    statsArea.style.bottom = '0';
    statsArea.style.right = '0';
    statsArea.style.height = '350px';
    statsArea.style.width = '200px';
    statsArea.style.margin = 'auto 700px auto auto';
    document.body.appendChild(statsArea);


    var heroInfo =  document.createElement('textarea');
    heroInfo.setAttribute('class', 'heroInfo');
    heroInfo.style.height = '160px';
    heroInfo.style.width = '200px';
    heroInfo.style.marginTop = '10px';
    heroInfo.style.backgroundColor = 'white';
    heroInfo.style.overflowY = 'hidden';
    heroInfo.style.resize = 'none';
    heroInfo.readOnly = 'true';
    heroInfo.disabled = 'true';
    heroInfo.style.cursor = "default";
    document.body.appendChild(heroInfo);

    var monsterInfo =  document.createElement('textarea');
    monsterInfo.setAttribute('class', 'monsterInfo');
    monsterInfo.style.height = '160px';
    monsterInfo.style.width = '200px';
    monsterInfo.style.backgroundColor = 'white';
    monsterInfo.style.overflowY = 'hidden';
    monsterInfo.style.resize = 'none';
    monsterInfo.readOnly = 'true';
    monsterInfo.disabled = 'true';
    monsterInfo.style.cursor = "default";
    document.body.appendChild(monsterInfo);

    statsArea.appendChild(monsterInfo);
    statsArea.appendChild(heroInfo);




    /*CONSTRUCTOR FUNCTIONS*/

    function character (name, hitpoints, armorclass, attackbonus, weapondamage) {
    this.name = name;
    this.hitPoints = hitpoints;
    this.armorClass = armorclass;
    this.attackBonus = attackbonus;
    this.weaponDamage = weapondamage;
    this.stats = function(){
    return  this.name + "\n" +
    "Hit Points: " + this.hitPoints + "\n" +
            "Armor Class: " + this.armorClass + "\n" +
            "Attack Bonus: " + this.attackBonus + "\n" +
            "Weapon Damage: " + this.weaponDamage;
    };
    this.alive = true;
    this.reset = function (){
        this.hitPoints = hitpoints;
        this.armorClass = armorclass;
        this.attackBonus = attackbonus;
        this.weaponDamage = weapondamage;
      };
}

var Arquer = new character("Arquer", 15, 6, 5, 8);  

function selectMonster () {
    var werewolf = new character("Werewolf", 15, 4, 4, 3);
    var goblin = new character("Goblin", 15, 4, 4, 3);
    switch(Math.floor(Math.random()*2)+1){
      case 1: return werewolf;
      case 2: return goblin;
    }
 }


var buttonAttack= document.createElement('input');
buttonAttack.setAttribute('type','button');
buttonAttack.setAttribute('value','Attack');
document.body.appendChild(buttonAttack);

var current_monster = selectMonster();

heroInfo.value = Arquer.stats() + "\n" + "Alive: " + Arquer.alive;
monsterInfo.value = current_monster.stats() + "\n" + "Alive: " + current_monster.alive; 

buttonAttack.onclick = function(){
if (current_monster.hitPoints <= 0){current_monster = selectMonster();monsterInfo.value = current_monster.stats() + "\n" + "Alive: " + current_monster.alive;}  
else{battle(Arquer, current_monster);}
};


function battle (hero, monster){

  if(hero.alive===true && monster.alive===true){
    var heroIniciative = Math.floor(Math.random()*20)+1;
    var monsterIniciative = Math.floor(Math.random()*20)+1;
    var attacker;
    var defender;
    var attackerInfo;
    var defenderInfo;
    /*INICIATIVE ROLL*/
    if (heroIniciative >= monsterIniciative){
        attacker = hero;
        defender = monster;
        attackerInfo = heroInfo;
        defenderInfo = monsterInfo;
        textInfo.value += attacker.name + " attacks first!: " + heroIniciative + " vs " + monsterIniciative + "\n";
        textInfo.scrollTop = textInfo.scrollHeight;
        attack(attacker, defender, attackerInfo, defenderInfo);
        attack(defender, attacker, defenderInfo, attackerInfo);
    }
    else {
    attacker = monster;
    defender = hero;
    attackerInfo = monsterInfo;
    defenderInfo = heroInfo;
        textInfo.value += attacker.name + " attacks first!: " + monsterIniciative + " vs " + heroIniciative + "\n",
        textInfo.scrollTop = textInfo.scrollHeight;
        attack(attacker, defender, attackerInfo, defenderInfo);
        attack(defender, attacker, defenderInfo, attackerInfo);
    }
    check_defeat(attacker, defender, attackerInfo, defenderInfo);
  }
  else {reset (hero, monster);
}
}


function attack (attacker, defender, attackerInfo, defenderInfo){
    var d20 = Math.floor(Math.random()*20)+1;
    var d_wp = Math.floor(Math.random()*attacker.weaponDamage)+1;
    /*ROUND ONE*/
    if (d20+attacker.attackBonus>defender.armorClass){
        textInfo.value += attacker.name +" d20+" + attacker.attackBonus+": " + (d20+attacker.attackBonus)+ " vs AC " + defender.armorClass + "\n" + attacker.name +" hits! d" + attacker.weaponDamage + ": " + d_wp  + "\n";
        textInfo.scrollTop = textInfo.scrollHeight;
        defender.hitPoints = defender.hitPoints - d_wp;
        defenderInfo.value = defender.stats();
        defenderInfo.append("\n" + "Alive: " + defender.alive);
        }
    else {
        textInfo.value += attacker.name + " misses! d20+" + attacker.attackBonus+": " + (d20+attacker.attackBonus)+ " vs AC " + defender.armorClass;
        textInfo.scrollTop = textInfo.scrollHeight;
        defenderInfo.value = defender.stats();
        defenderInfo.append("\n" + "Alive: " + defender.alive);
   }}


function check_defeat (attacker, defender, attackerInfo, defenderInfo) {
    if (attacker.hitPoints <= 0){
        attacker.hitPoints = 0;
        attacker.alive = false,
        attackerInfo.value = attacker.stats();
        attackerInfo.append("\n" + "Alive: " + attacker.alive);
        textInfo.value += "\n" +defender.name + " killed " + attacker.name + "!";
        textInfo.scrollTop = textInfo.scrollHeight;
     } 
    if (defender.hitPoints <= 0){
        defender.hitPoints = 0;
        defender.alive = false,
        defenderInfo.value = defender.stats();
        defenderInfo.append("\n" + "Alive: " + defender.alive);  
        textInfo.value += "\n" + attacker.name + " killed " + defender.name + "!";
     }
}

function reset (hero, monster) {
    if (hero.alive===false){
        hero.reset();
        hero.alive = true;
        heroInfo.value = hero.stats();
        heroInfo.append("\n" + "Alive: " + hero.alive);  
    }
    if (monster.alive===false){
        monster.reset();
        monster.alive = true;
        monsterInfo.value = monster.stats(); 
        monsterInfo.append("\n" + "Alive: " + monster.alive);  
    }
}  
}

(由于某种原因,它在jsfiddle中不起作用)。问题出在功能战中。

function battle (hero, monster){

  if(hero.alive===true && monster.alive===true){
    var heroIniciative = Math.floor(Math.random()*20)+1;
    var monsterIniciative = Math.floor(Math.random()*20)+1;
    var attacker;
    var defender;
    var attackerInfo;
    var defenderInfo;
    /*INICIATIVE ROLL*/
    if (heroIniciative >= monsterIniciative){
        attacker = hero;
        defender = monster;
        attackerInfo = heroInfo;
        defenderInfo = monsterInfo;
        textInfo.value += attacker.name + " attacks first!: " + heroIniciative + " vs " + monsterIniciative + "\n";
        textInfo.scrollTop = textInfo.scrollHeight;
        attack(attacker, defender, attackerInfo, defenderInfo);
        attack(defender, attacker, defenderInfo, attackerInfo);
    }
    else {
    attacker = monster;
    defender = hero;
    attackerInfo = monsterInfo;
    defenderInfo = heroInfo;
        textInfo.value += attacker.name + " attacks first!: " + monsterIniciative + " vs " + heroIniciative + "\n",
        textInfo.scrollTop = textInfo.scrollHeight;
        attack(attacker, defender, attackerInfo, defenderInfo);
        attack(defender, attacker, defenderInfo, attackerInfo);
    }
    check_defeat(attacker, defender, attackerInfo, defenderInfo);
  }
  else {reset (hero, monster);
}
}

当我调用它时,它只执行第一次功能攻击,但不执行第二次功能攻击。

buttonAttack.onclick = function(){
if (current_monster.hitPoints <= 0){current_monster = selectMonster();monsterInfo.value = current_monster.stats() + "\n" + "Alive: " + current_monster.alive;}  
else{battle(Arquer, current_monster);}
};

4 个答案:

答案 0 :(得分:4)

执行功能时,您不必预先编写功能。

bool

答案 1 :(得分:1)

它应该有用 -

function two(a,b){
  console.log(a+b);
}

function one(){
 two(1,2);
 two(3,4);  
}

one();

输出:

2

7

答案 2 :(得分:0)

最好,最简单的解决方案是将Promist.all()与nodejs一起使用

示例

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']

答案 3 :(得分:0)

你可以简单地调用一个函数两次或任何你想记住它的参数和数据类型的时间,因为你不必在函数调用中放置数据类型,但如果数据类型错误,它可能会造成严重的混乱。

>

//现在很乱