跨函数访问变量出现ReferenceError?如何正确获取所需变量?
解决方法
问题出在这两点:
poss、loss、koss是upme函数内部的局部变量,外部函数doso根本访问不到它们。- 你调用
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
相关产品推荐
相关产品推荐

