JavaScript如何将一个函数的计算变量传递到另一个函数中使用
问题原因
你当前无法获取pg变量的核心原因是变量作用域限制。你在GradingScheme函数内部用var声明的pg属于局部变量,仅在GradingScheme函数执行的生命周期内有效,函数执行结束后变量就会被销毁,其他函数无法直接访问。
解决方案1:全局变量存储(最适合初学者,改造成本最低)
只需要把pg的声明提到两个函数的外层,变成全局作用域的变量,两个函数就都可以直接读写这个变量。以下是修改后的完整代码:
// 在两个函数外层声明全局pg变量 let pg; function GradingScheme() { var quiz1, quiz2, quiz3, ass1, ass2, lab1, lab2, lab3, pegrade; quiz1 = parseFloat(document.getElementById("quiz1").value); quiz2 = parseFloat(document.getElementById("quiz2").value); quiz3 = parseFloat(document.getElementById("quiz3").value); ass1 = parseFloat(document.getElementById("ass1").value); ass2 = parseFloat(document.getElementById("ass2").value); lab1 = parseFloat(document.getElementById("lab1").value); lab2 = parseFloat(document.getElementById("lab2").value); lab3 = parseFloat(document.getElementById("lab3").value); pegrade = parseFloat(document.getElementById("pegrade").value); const quiz4 = (quiz1 + quiz2 + quiz3) / 3; const ass3 = (ass1 + ass2) / 2; const lab4 = (lab1 + lab2 + lab3) / 3; const cs = (quiz4 * 0.6) + (ass3 * 0.2) + (lab4 * 0.2); // 去掉var,直接给全局pg变量赋值 pg = (cs * 0.5) + (pegrade * 0.5); document.getElementById("demo").innerHTML = "Your Prelim grade is: " + pg.toFixed(1); } function MIDTERM() { // 新增校验:避免未计算预考成绩直接算期中成绩的报错 if (typeof pg === 'undefined') { document.getElementById("demo").innerHTML = "请先完成预考成绩计算后再操作"; return; } const quiz1 = parseFloat(document.getElementById("2quiz1").value); const quiz2 = parseFloat(document.getElementById("2quiz2").value); const quiz3 = parseFloat(document.getElementById("2quiz3").value); const ass1 = parseFloat(document.getElementById("2ass1").value); const ass2 = parseFloat(document.getElementById("2ass2").value); const lab1 = parseFloat(document.getElementById("2lab1").value); const lab2 = parseFloat(document.getElementById("2lab2").value); const lab3 = parseFloat(document.getElementById("2lab3").value); const Midterm = parseFloat(document.getElementById("mgrade").value); const quiz4 = (quiz1 + quiz2 + quiz3) / 3; const ass3 = (ass1 + ass2) / 2; const lab4 = (lab1 + lab2 + lab3) / 3; const cs = (quiz4 * 0.6) + (ass3 * 0.2) + (lab4 * 0.2); const tmg = (cs * 0.5) + (Midterm * 0.5); // 直接使用全局pg变量计算即可 const mg = (1/3 * pg) + (2/3 * tmg); document.getElementById("demo").innerHTML = "Your Midterm grade is: " + mg.toFixed(1); }
注:代码里补充了变量声明的关键字
const,避免隐式创建全局变量引发其他未知问题,不影响原有逻辑。
解决方案2:函数返回值传递(更规范的写法,避免全局变量污染)
如果不想使用全局变量,可以让GradingScheme函数执行后返回计算得到的pg值,自行控制存储时机,适合后续需要扩展更多计算逻辑的场景:
function GradingScheme() { // ... 中间原有计算逻辑不变 const pg = (cs * 0.5) + (pegrade * 0.5); document.getElementById("demo").innerHTML = "Your Prelim grade is: " + pg.toFixed(1); // 新增return语句返回pg值 return pg; } // 自行定义变量存储预考成绩 let prelimGrade; // 绑定预考计算按钮的点击事件,把返回的pg存到prelimGrade里 document.querySelector('#prelim计算按钮的选择器').addEventListener('click', () => { prelimGrade = GradingScheme(); }) function MIDTERM() { if (typeof prelimGrade === 'undefined') { document.getElementById("demo").innerHTML = "请先完成预考成绩计算后再操作"; return; } // ... 原有逻辑不变,计算的时候用prelimGrade代替pg即可 const mg = (1/3 * prelimGrade) + (2/3 * tmg); }
内容的提问来源于stack exchange,提问作者Redien Leyba
相关产品推荐
相关产品推荐

