с технической точки зрения никаких проблем нет
var foo = 25;
function bar(foo) {
console.log(foo);
}
bar(42) // выведет "42", т.к. внутри функции foo ссылается на параметр, не на глобальную переменную. это и есть замещение
в этом примере foo снаружи и foo внутри - две абсолютно независимые переменные. снаружи foo равно 25, внутри - оно равно входному параметру 42
трагично здесь вот что: представьте, что не вы писали код и читаете его в первый раз. вы пытаетесь понять, откуда взялось foo, которое используется в конце длинной функции. начинаете искать по файлу и обнаруживаете, что есть несколько несвязанных между собой переменных, имеющих одно и то же имя. в какой же из этих переменных то самое значение, которое выводится в bar?
var foo = 25;
// 20-30 строк кода
function makeMeFun() {
// 20-40 строк кода
console.log(foo);
}
function bar(bez, buz, kek, lol, cheburek, foo) {
// 20-40 строк кода
console.log(foo);
}
bar(42) // что мы получим на выходе? а чёрт его разберёт
именно поэтому одна из двух самых сложных задач в программировании - придумывание имён