【问题标题】:Why does this function execute immediatly [duplicate]为什么此功能立即执行[重复]
【发布时间】:2020-09-30 08:34:59
【问题描述】:
const ATTACK_VALUE = 10;
const STRONG_ATTACK_VALUE = 17;
const MONSTER_ATTACK_VALUE = 14;

function attackHandler( typeOfAttack ) {
    const damageOne = typeOfAttack
    const damageTwo = dealMonsterDamage(damageOne)

    currentMonsterHealth -= damageTwo;
    playerDamage = dealPlayerDamage(MONSTER_ATTACK_VALUE);
    currentPlayerHealth -= playerDamage;

    if ( currentMonsterHealth <= 0 && currentPlayerHealth > 0 ) {
        alert('You won!');
    } else if ( currentPlayerHealth <= 0 && currentMonsterHealth > 0 ) {
        alert('You lost!');
    } else if ( currentPlayerHealth <= 0 && currentMonsterHealth <= 0 ) {
        alert('You have a draw');
    }        
}
        
        
attackBtn.addEventListener( 'click', attackHandler( ATTACK_VALUE ) );
strongAttackBtn.addEventListener( 'click', attackHandler( STRONG_ATTACK_VALUE ) );

其他代码

function dealMonsterDamage(damage) {
    const dealtDamage = Math.random() * damage;
    monsterHealthBar.value = +monsterHealthBar.value - dealtDamage;

    return dealtDamage;
}

我刚开始学习编码并一直在学习一个教程,我想我会进行实验,我想知道为什么这不起作用。它立即执行,之后的按钮不起作用

【问题讨论】:

  • 如果您得到了答案,请不要忘记单击答案左侧对您来说正确的复选标记:)。

标签: javascript function


【解决方案1】:

您必须将函数调用更改为以下内容:

attackBtn.addEventListener(
    'click', 
    function() {
        attackHandler(ATTACK_VALUE);
    }
);

strongAttackBtn.addEventListener(
    'click', 
    function() { 
        attackHandler(STRONG_ATTACK_VALUE); 
    }
);

addEventListener 第二个参数是一个回调。一旦引发事件,就会执行回调。

那么回调就是调用你想要的函数了。

更新:

由于与 StackOverflow 其他成员的争论,我删除了对箭头函数的引用作为回调。

他们是对的。如果您不是经验丰富的开发人员,这可能不是一个好习惯。

[....] 部分答案已删除

【讨论】:

  • 在回答明显重复时被拒绝为“无用”
  • "Sidenote" 的相关性如何?箭头函数不会改变任何东西
  • 警告,使用箭头函数作为监听器可能会导致问题。默认情况下,监听函数有this 指向当前元素。使用箭头功能可以防止它
  • 箭头函数带来了一些独特的功能,当 OP 按照您的建议使用它们时,这些功能可能会造成更多的伤害而不是好处(“将函数(){}替换为()=>” )。至少添加一个指向良好文档的链接(例如 MDN 或此处的 SO)并添加关于这些功能的注释。
  • @MerianosNikos 箭头函数用于匿名函数的同义词。所以它会正常工作。但是它们带来了一些额外的东西,如果你不知道那些额外的东西是什么,那就是你开始让代码变得脆弱的地方
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
相关资源
最近更新 更多