var testarr = []
var prevScroll = 0
var cache = 0
// 仅在区域内计算 if (y >= testarr[0] && y <= testarr[testarr.length - 1]) { // down if (y >= prevScroll) { var down = (function (x) { // 如果存在缓存索引,并且满足滚动的区域,那么return if (cache != null && y >= testarr[cache] && y < testarr[cache + 1]) return false // 如果入参是null,说明是第一次,初始化为0吧 x = x == null ? 0 : x; // 判断当前滚动是否在某个范围内 if (y >= testarr[x] && y < testarr[x + 1]) { // 这里是你要写的代码 console.log('down', 'ABCDEFGHJKLMNPQRSTWXYZ'.split('')[x]) // 设置缓存 cache = x // 保险起见,虽然绝对不会溢出。如果没有的话,那么增加索引, 继续往下搜索 } else if (x < testarr.length - 1) { // 递归 down(++x); } }); down(cache); // up // TODO: 如果小于第一个的话,应该取消 // TODO: 如果是从中间开始的情况要考虑 // TODO: 避免重复执行 } else { var up = (function (x) { if (y < testarr[x]) { console.log('up', 'ABCDEFGHJKLMNPQRSTWXYZ'.split('')[x - 1]) cache = x - 1 } }); up(cache); } } else if (cache != null) { // 这里重置 console.log(1) cache = null }