Javascript JS:在哪里实例化返回另一个函数的函数?
我正在制作一个无限卷轴,我做的第一件事是附加一个eventListener来检测卷轴何时接近底部,如果接近底部,则触发Javascript JS:在哪里实例化返回另一个函数的函数?,javascript,Javascript,我正在制作一个无限卷轴,我做的第一件事是附加一个eventListener来检测卷轴何时接近底部,如果接近底部,则触发scrollLoader() 我制作了下面的scrollLoader函数,现在,它使用setTimeout来模拟异步获取,直到我有一个端点为止。该函数返回一个函数,以便加载数据不在全局范围内 function checkScroll() { let loadingData; return function() { if
scrollLoader()
- 我制作了下面的
函数,现在,它使用setTimeout来模拟异步获取,直到我有一个端点为止。该函数返回一个函数,以便scrollLoader
不在全局范围内加载数据
function checkScroll() { let loadingData; return function() { if (loadingData) { return } loadingData = true; new Promise((resolve) => { setTimeout(() => { resolve() }, 5000) }) .then(() => { loadingData = false; }) } }
scrollLoader
,因为它返回一个函数,并用变量的
const detectScroll=scrollLoader()
并编辑eventListener以立即调用它,而不是直接调用scrollLoader()
:
window.addEventListener('scroll', () => {
if (window.innerHeight + window.scrollY + 100 >= document.body.offsetHeight) {
detectScroll();
}
})
我应该把这一行放在代码的什么地方(const detectScroll=scrollLoader()
)?无论我把它放在哪里,它似乎都不合适,因为它只是在那里实例化一次。如果这是唯一一个使用此代码的地方,那么这是使用立即调用函数表达式(IIFE)的最佳时机:
注意语法:(()=>{…})()代码>
window.addEventListener('scroll',()=>{
if(window.innerHeight+window.scrollY+100>=document.body.offsetHeight){
让我们加载数据;
(() => {
if(加载数据){
返回
}
加载数据=真;
新承诺((决议)=>{
设置超时(()=>{
解决()
}, 5000)
})
.然后(()=>{
loadingData=false;
})
})();
}
})
您可能使这项工作变得比需要的更困难。是否有某些原因导致加载数据不能存在于全局范围中?如果它不在全局范围内,那么至少需要将其作为参数传递给checkScroll();否则,函数将始终使用falsy值来加载数据,因为变量是在函数本身中实例化的。这是一个闭包,所以如果实例化一次,变量值将存在于函数中,谢谢!如果我不使用IFFE呢?实例化应该存在于代码中的什么地方?您是希望按照自己的方式进行,还是希望学习并遵循最佳实践?作为旁注,您不实例化函数,而是调用或调用它们。但是,如果您想按自己的方式做事,占用更多内存并浪费CPU周期,用函数调用替换IIFE,那么您实际上可以根据上面的代码执行scrollLoader()()
。那就行了。@RicardoAlvveroa-请考虑:
window.addEventListener('scroll', () => {
if (window.innerHeight + window.scrollY + 100 >= document.body.offsetHeight) {
detectScroll();
}
})