JavaScript黄金换算工具出现ReferenceError: q未定义的原因及修复
错误原因与修复方案
错误原因
q是main函数内部的局部变量,pr_gold函数无法访问其他函数内部的局部变量,因此触发ReferenceError: q is not defined。- 除了
q,wx、a、c、ws、calcx等变量也都是各自函数的局部变量,跨函数访问都会引发类似错误。 - 代码直接调用
pr_gold(),但getData和main这两个异步函数未被执行,导致依赖的价格数据、用户输入都无法初始化。
修复步骤
- 调整变量作用域:将需要跨函数共享的变量声明在全局作用域,确保各函数能正常访问。
- 正确执行异步逻辑:把整个流程放在异步入口函数中,用
await确保数据获取、用户输入完成后再执行计算。 - 完善循环输入逻辑:修改
main函数为循环结构,直到用户输入5才结束计算。
修复后的完整代码
// 全局声明共享变量 let a, c, ws, calcx = []; // 打印欢迎信息 console.log('||| 欢迎使用土耳其金币盎司价格换算工具 |||'); console.log('||| 请输入对应金币的数字编号 |||'); console.log('||| 共和国金币(1),Tam金币(2),Yarım金币(3),Çeyrek金币(4),结束计算并显示总额(5) |||'); console.log('||| 工具将按顺序计算你输入的所有金币价值 |||'); console.log('||| 输入5并任意输入数量即可结束计算 |||'); // 从网页获取金价数据 async function getData() { const url = 'https://yorum.altin.in/tum/ons'; const headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36' }; const page = await fetch(url, { headers }); const content = new DOMParser().parseFromString(await page.text(), 'text/html'); const x = content.getElementById('ofiy').innerText.trim(); const y = content.getElementById('dfiy').innerText.trim(); a = parseFloat(x.substring(1, 9)); c = parseFloat(y.substring(0, 6)); ws = [ 0.212666471635951 * a * c, 0.206772168098369 * a * c, 0.103386084049185 * a * c, 0.0516930420245924 * a * c ]; } // 主循环:获取用户输入 async function main() { while (true) { let q = parseInt(prompt('请输入金币的对应编号: ')); let wx = parseInt(prompt('请输入对应金币的数量: ')); pr_gold(q, wx); if (q === 5) break; } } // 计算金币价值 function pr_gold(q, wx) { if (q === 1) { calcx.push(ws[0] * wx); } else if (q === 2) { calcx.push(ws[1] * wx); } else if (q === 3) { calcx.push(ws[2] * wx); } else if (q === 4) { calcx.push(ws[3] * wx); } else if (q === 5) { console.log(`||| 计算完成。美元/里拉汇率为 ${c} TRY,黄金盎司价格为 ${a} USD |||`); console.log(`||| 你的土耳其金币总价值为 ${Math.ceil(calcx.reduce((sum, item) => sum + item, 0))} TRY |||`); } else { console.log("输入无效,请输入1-5之间的数字。"); } } // 初始化应用:先获取数据再启动交互 async function init() { await getData(); await main(); } // 启动应用 init();
内容的提问来源于stack exchange,提问作者lex
相关产品推荐
相关产品推荐

