Если я правильно понял, эти аргументы функции, по сути являются ее переменными, а если таковые есть вне данной функции, они перезапишуться при вызове, а после выполнения функции вернутся в исходное значение, так?
Чекни что такое local scope, и когда вызывается fun() то создаётся local scope именно для этого вызова, то есть если ты вызовешь её три раза с разными args то будут созданы три разных local scope, если поймёшь этот момент то тебе не составит труда понять концепцию замыкания)