JavaScript函数间变量传递及相乘出现NaN问题排查
问题原因及解决方案
核心问题
- 变量作用域冲突:全局声明的
stawka1和kurs1从未被修改——你在stawka()和kurs()函数里用const重新声明了同名局部变量,函数执行结束后局部变量销毁,全局变量始终保持初始值0。 - 函数调用未传参:点击按钮调用
mozlwygr()时未传递参数,函数内的stawka1和kurs1参数值为undefined,undefined * undefined直接返回NaN。 - 函数重复定义:
mozlwygr被定义两次,后定义的函数会覆盖前一个,属于冗余代码。
修复后的代码
JavaScript 部分
let kurs1 = 0; let stawka1 = 0; function druzyny() { let druz = prompt("Podaj drużynę pierwszą."); let druz2 = prompt("Podaj drużynę drugą."); document.getElementById("druzyna1").innerHTML = "Drużyna pierwsza: " + druz; document.getElementById("druzyna2").innerHTML = "Drużyna druga: " + druz2; } function stawka() { // 移除const,直接修改全局变量 stawka1 = parseInt(prompt("Podaj stawkę.")); if (isNaN(stawka1)) { console.log("Błąd: Stawka to nie liczba."); return; } console.log("Stawka:", stawka1); document.getElementById("p1").innerHTML = "Stawka wynosi: " + stawka1 + "zł."; } function kurs() { // 移除const,直接修改全局变量 kurs1 = parseInt(prompt("Podaj kurs.")); if (isNaN(kurs1)) { console.log("Błąd: Kurs to nie liczba."); return; } console.log("Kurs:", kurs1); document.getElementById("kurs").innerHTML = "Kurs wynosi: " + kurs1 + "x"; } // 保留带检查的函数,移除重复定义,直接使用全局变量 function mozlwygr() { if (isNaN(stawka1) || isNaN(kurs1)) { console.log("Błąd: Stawka lub kurs to nie liczba."); return; } let wygrana = stawka1 * kurs1; document.getElementById("mozliwawygrana1").innerHTML = "Możliwa wygrana: " + wygrana + "zł."; }
HTML 部分(无需修改)
<button id="butt-wyjdz" type="button" class="btn btn-info" onclick="stawka()">Ustaw stawkę</button> <button id="butt-kurs" type="button" class="btn btn-info" onclick="kurs()">Ustaw kurs</button> <button id="butt-kurs" type="button" class="btn btn-success" onclick="mozlwygr()">Oblicz możliwą wygraną</button> <button type="button" class="btn btn-secondary" id="liveAlertBtn" onclick="losuj(), mozlwygr()">Przewiduj</button> <button id="butt-druz" type="button" class="btn btn-info" onclick="druzyny()">Drużyny</button> <script src="gamb1.js"></script> <script src="scriptsite.js"></script>
额外优化建议
- 用
parseFloat替代parseInt,支持小数金额和汇率。 - 在
prompt中补充输入提示,比如prompt("Podaj stawkę (liczba, np. 100):"),引导用户输入正确格式。 - 将全局变量封装到对象中,避免全局作用域污染,比如
const appData = { stawka1: 0, kurs1: 0 },函数内修改appData.stawka1。
内容的提问来源于stack exchange,提问作者Tomasz Ciszewski
相关产品推荐
相关产品推荐

