В этом случае использования в игру вступают затворы. Вам нужно создать функцию, которая возвращает функцию; затем каждый раз, когда вызывается функция создателя, создается новый i
с желаемой областью действия:
function createPlayerFactory() {
let i = 0;
return (name) => {
id++;
return {name, id};
}
}
const playerFactory = createPlayerFactory();
playerFactory("A"); // {name: "A", id: 0}
playerFactory("B"); // {name: "B", id: 1}
playerFactory("C"); // {name: "C", id: 2}