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

跨函数访问变量出现ReferenceError?如何正确获取所需变量?

解决方法

问题出在这两点:

  1. poss、loss、koss是upme函数内部的局部变量,外部函数doso根本访问不到它们。
  2. 你调用upme()后把返回值存在了saka里,但没从saka里提取变量,直接写poss自然会报未定义错误,而且当前upme也没返回koss。

下面给两种靠谱的解决方式:

方式一:让upme返回包含所有需要变量的对象(推荐)

这种方式不会污染全局作用域,逻辑更清晰:

document.addEventListener('DOMContentLoaded', upme);
window.addEventListener('resize', upme);
function upme()
{
  var rome = document.getElementById("out-cmnt");
  var rect = rome.getBoundingClientRect();
  var poss = rect.top + window.scrollY; 
  var koss = rect.bottom + window.scrollY; 
  var loss = koss - poss; 
  // 返回包含三个变量的对象,比数组更直观,不用记顺序
  return { poss, loss, koss };
}

document.addEventListener('DOMContentLoaded', doso);
window.addEventListener('scroll', doso);
function doso()
{
  lopp = document.getElementById("Web_1920__1");
  hope = lopp.clientHeight; 
  const meme = document.body.scrollHeight;
  const keke = hope/meme; 
  const scsc = window.scrollY;
  var innr = window.innerHeight;
     
  // 调用upme并解构出需要的变量
  const { poss, loss, koss } = upme();
  var noss = poss - innr + loss; 

  if(scsc > noss && window.matchMedia("(min-width: 765px)").matches)
  {
      // 执行你的逻辑
  }
} 
doso();

方式二:把变量放到外部作用域

如果觉得对象返回太麻烦,可以把三个变量声明在两个函数外面,让upme去更新它们,doso直接使用:

// 在函数外部声明变量,让两个函数都能访问
let poss, loss, koss;

document.addEventListener('DOMContentLoaded', upme);
window.addEventListener('resize', upme);
function upme()
{
  var rome = document.getElementById("out-cmnt");
  var rect = rome.getBoundingClientRect();
  poss = rect.top + window.scrollY; 
  koss = rect.bottom + window.scrollY; 
  loss = koss - poss; 
}

document.addEventListener('DOMContentLoaded', doso);
window.addEventListener('scroll', doso);
function doso()
{
  lopp = document.getElementById("Web_1920__1");
  hope = lopp.clientHeight; 
  const meme = document.body.scrollHeight;
  const keke = hope/meme; 
  const scsc = window.scrollY;
  var innr = window.innerHeight;
     
  // 直接使用外部作用域的变量
  var noss = poss - innr + loss; 

  if(scsc > noss && window.matchMedia("(min-width: 765px)").matches)
  {
      // 执行你的逻辑
  }
} 
// 注意:先调用upme初始化变量,再调用doso,避免第一次执行doso时变量未定义
upme();
doso();

注意事项

  • 方式二要注意先调用upme初始化变量,不然第一次执行doso时变量还是undefined,会出问题。
  • 尽量用方式一,减少全局变量的使用,避免命名冲突和意外修改。

内容的提问来源于stack exchange,提问作者Soumya Roy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 10:55:50