You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 19:36:03