Почему не работает функция внутри цикла?
Просто в цикле for замените объявление переменной var на let. А еще почитайте вот этот материал — https://github.com/azat-io/you-dont-know-js-ru/blo... чтобы понять почему так произошло. В вашем примере переменная i хранит всегда последнее значение в переборе цикла.
потому что i вне зоны видимости для addEventListener. Можно сохранять ид в data аттрибут элемента для click а потом получать его используя this