Было:
$(".s"+i).on("ifUnchecked", function () {
ctoggler("sport"+i, 0);
alert(i);
});
$(".s"+i).on("ifChecked", function () {
ctoggler("sport"+i, 1);
});
Стало:
$(".s"+i).on("ifUnchecked", function (i) { // <--- аргумент
ctoggler("sport"+i, 0);
alert(i);
}.bind(null, i)); // <--- зафиксировали
$(".s"+i).on("ifChecked", function (i) { // <--- аргумент
ctoggler("sport"+i, 1);
}.bind(null, i)); // <--- зафиксировали
Альтернатива 1, так делают обычно:
(function(i) { // <--- аргумент
$(".s"+i).on("ifUnchecked", function () {
ctoggler("sport"+i, 0);
alert(i);
});
$(".s"+i).on("ifChecked", function () {
ctoggler("sport"+i, 1);
});
}) (i) // <---- зафиксировали
Альтернатива 2, современный javascript:
for(let i=1; i<23; i++){
// Код как у вас, let создается в каждой итерации цикла заново,
// и замыкания работают как надо.
}