Информацию об объекте лучше хранить в нём же самом. Для этого используем data() (это не совсем одно и то же, что dataset). То есть все найденные позиции мы сохранили data('position', 'найденное_значение'). Цикл по уже когда-то найденной коллекции LI.
Куда же сохранить флаг об изменении элемента?)) Я думаю, вы уже догадались — например, data('changed', true).
var li = block.find('li'); //Нашли только 1 раз
$(window).on('scroll', function (e) {
var scrollTop = $window.scrollTop(); //Вычислили только 1 раз
li.each(function () {
var $item = $(this);
if($item.data('position') >= scrollTop){
$item.addClass('active');
} else {
$item.removeClass('active');
}
});
});
Вы производите много абсолютно лишних действий:
— постоянно определяете прокрутку (надо только 1 раз)
— постоянно находите LI в цикле (надо только 1 раз)
— в каждой итерации пробегаете по всем найденным LI, меняя класс им всем (итого на круг выходит LI в квадрате)