无限滚动实现中,返回函数的函数实例化位置咨询
解决无限滚动中闭包函数实例化位置的问题
嘿,我来帮你理顺这个问题~你担心的「只需要执行一次的实例化代码放哪里」其实很简单,有几个非常合适的位置,完全符合你的需求:
1. 全局脚本的顶层(最推荐)
如果你的脚本是放在页面底部(或者用defer/async确保DOM加载后执行),直接把实例化代码写在全局作用域里就行——全局作用域的代码只会在页面加载时执行一次,刚好满足你只创建一次闭包的需求。示例代码:
// 先定义你的闭包函数(注意你代码里的命名:你写的是checkScroll,但描述里提的是scrollLoader,记得统一命名哦) function checkScroll() { let loadingData; return function() { if (loadingData) { return } loadingData = true; new Promise((resolve) => { setTimeout(() => { resolve() }, 5000) }) .then(() => { loadingData = false; // 这里可以加真正的加载数据逻辑,比如渲染新列表项 }) } } // 关键:实例化代码放在全局顶层,只执行一次 const detectScroll = checkScroll(); // 最后添加滚动监听 window.addEventListener('scroll', () => { if (window.innerHeight + window.scrollY + 100 >= document.body.offsetHeight) { detectScroll(); } });
这样detectScroll会在页面加载时就创建好,闭包里的loadingData变量只会初始化一次,不会每次触发滚动都重新生成,完美避免全局污染的同时保证逻辑正确。
2. DOMContentLoaded回调内
如果你的脚本是放在<head>标签里(担心DOM未就绪的情况),或者你习惯把所有初始化逻辑放在DOM加载完成后执行,就把实例化和事件监听都塞进DOMContentLoaded回调里:
document.addEventListener('DOMContentLoaded', () => { // 定义闭包函数 function checkScroll() { let loadingData; return function() { if (loadingData) { return } loadingData = true; new Promise((resolve) => { setTimeout(() => { resolve() }, 5000) }) .then(() => { loadingData = false; }) } } // 实例化(仅执行一次) const detectScroll = checkScroll(); // 添加滚动监听 window.addEventListener('scroll', () => { if (window.innerHeight + window.scrollY + 100 >= document.body.offsetHeight) { detectScroll(); } }); });
这个方式更稳妥,确保所有逻辑都在DOM完全就绪后才启动,同样实例化代码只会执行一次。
3. ES模块环境下
如果你的项目用了ES模块(import/export),直接把实例化代码放在模块顶层即可——模块的顶层代码只会在模块首次被导入时执行一次:
// 比如infiniteScroll.js模块 function checkScroll() { // ... 函数内容 } // 模块内实例化,仅执行一次 const detectScroll = checkScroll(); // 导出初始化方法 export function initInfiniteScroll() { window.addEventListener('scroll', () => { if (window.innerHeight + window.scrollY + 100 >= document.body.offsetHeight) { detectScroll(); } }); }
然后在项目入口文件导入并调用initInfiniteScroll()就行,完全不用担心重复实例化的问题。
最后提个小细节:你代码里的函数命名有点小矛盾(定义的是checkScroll,但描述里说scrollLoader),记得统一命名,避免后续混淆哦~
内容的提问来源于stack exchange,提问作者RicardoAlvveroa
相关产品推荐
相关产品推荐

