◆ すでに宣言されてるエラーは出なくなるけど 呼び出すときに関数が違うので結局エラーになる
◆ それどころか 動いてるけど返ってくる値が本来のと違っていてわかりづらいバグの元

JavaScript や PHP でよくみる「関数がなければ関数を定義する」という処理 あれってムダだと思うんです

前提として 「こういう動きするっていうのは決まっていてブラウザがまだ実装してないから同じ動きさせてる」というのは除きます
昔の IE に ES5 や ES6 の機能を実装するのも同じく別です

同じ名前が被るかもしれないだけで 仕様が決まってないか公式採用されることはなさそうな関数についてです

関数が存在しない場合

関数が定義されて普通に実行できます
チェックするだけ無駄があります

関数が存在する場合

関数があるか確認した場合

書き換えはしません

関数を定義するということはその関数をどこかで使ってるはずです
なのに すでに同じ名前で関数があるからと関数を書き換えしなかったら その関数を呼び出すところで全く別の関数を呼び出していることになります
引数と返り値がぜんぜん違うはずなのでどこかでエラーになるか意図しない動きをします

関数があるか確認しない場合

上書きします

自分が定義する関数で元からあるものを上書きしているのでその関数の呼び出し箇所は問題なく動くはずです

上書きで消された関数ですが 同じ名前を使って上書きする処理が残ってるということは その名前の関数が組み込まれる前に書かれたコードのはずです
そうなると 新しく組み込まれた関数として使ってるところはないはずです
なので基本的には問題なしです


PHP などの標準関数を上書きできない言語の場合は 上書きできずにエラーが出ます
ですが エラーがわかりやすいです
新しい関数が自分で定義した関数名とバッティングしてるとすぐにわかります

もし 同じ関数名があるから上書きしなかった場合は
  • なぜか呼び出しで引数がおかしいと言われる
  • 返り値がおかしいまま進んで関係ないところでエラー
  • エラーはないけど動きが正しくない

など明らかに原因を探すのが難しいことになります
すでに関数があるエラーが出たほうが原因がわかりやすくていいですよね

まとめ

エラーが出るにせよ とりあえず上書き処理したほうがいいです
上書きしなかったせいで思ってるのと動きが違う関数を実行したところで分かりづらいエラーかおかしな挙動をするだけです