関数があるかを調べて宣言するってムダじゃない?
◆ すでに宣言されてるエラーは出なくなるけど 呼び出すときに関数が違うので結局エラーになる
◆ それどころか 動いてるけど返ってくる値が本来のと違っていてわかりづらいバグの元
◆ それどころか 動いてるけど返ってくる値が本来のと違っていてわかりづらいバグの元
JavaScript や PHP でよくみる「関数がなければ関数を定義する」という処理 あれってムダだと思うんです
前提として 「こういう動きするっていうのは決まっていてブラウザがまだ実装してないから同じ動きさせてる」というのは除きます
昔の IE に ES5 や ES6 の機能を実装するのも同じく別です
同じ名前が被るかもしれないだけで 仕様が決まってないか公式採用されることはなさそうな関数についてです
チェックするだけ無駄があります
関数を定義するということはその関数をどこかで使ってるはずです
なのに すでに同じ名前で関数があるからと関数を書き換えしなかったら その関数を呼び出すところで全く別の関数を呼び出していることになります
引数と返り値がぜんぜん違うはずなのでどこかでエラーになるか意図しない動きをします
自分が定義する関数で元からあるものを上書きしているのでその関数の呼び出し箇所は問題なく動くはずです
上書きで消された関数ですが 同じ名前を使って上書きする処理が残ってるということは その名前の関数が組み込まれる前に書かれたコードのはずです
そうなると 新しく組み込まれた関数として使ってるところはないはずです
なので基本的には問題なしです
PHP などの標準関数を上書きできない言語の場合は 上書きできずにエラーが出ます
ですが エラーがわかりやすいです
新しい関数が自分で定義した関数名とバッティングしてるとすぐにわかります
もし 同じ関数名があるから上書きしなかった場合は
など明らかに原因を探すのが難しいことになります
すでに関数があるエラーが出たほうが原因がわかりやすくていいですよね
上書きしなかったせいで思ってるのと動きが違う関数を実行したところで分かりづらいエラーかおかしな挙動をするだけです
前提として 「こういう動きするっていうのは決まっていてブラウザがまだ実装してないから同じ動きさせてる」というのは除きます
昔の IE に ES5 や ES6 の機能を実装するのも同じく別です
同じ名前が被るかもしれないだけで 仕様が決まってないか公式採用されることはなさそうな関数についてです
関数が存在しない場合
関数が定義されて普通に実行できますチェックするだけ無駄があります
関数が存在する場合
関数があるか確認した場合
書き換えはしません関数を定義するということはその関数をどこかで使ってるはずです
なのに すでに同じ名前で関数があるからと関数を書き換えしなかったら その関数を呼び出すところで全く別の関数を呼び出していることになります
引数と返り値がぜんぜん違うはずなのでどこかでエラーになるか意図しない動きをします
関数があるか確認しない場合
上書きします自分が定義する関数で元からあるものを上書きしているのでその関数の呼び出し箇所は問題なく動くはずです
上書きで消された関数ですが 同じ名前を使って上書きする処理が残ってるということは その名前の関数が組み込まれる前に書かれたコードのはずです
そうなると 新しく組み込まれた関数として使ってるところはないはずです
なので基本的には問題なしです
PHP などの標準関数を上書きできない言語の場合は 上書きできずにエラーが出ます
ですが エラーがわかりやすいです
新しい関数が自分で定義した関数名とバッティングしてるとすぐにわかります
もし 同じ関数名があるから上書きしなかった場合は
- なぜか呼び出しで引数がおかしいと言われる
- 返り値がおかしいまま進んで関係ないところでエラー
- エラーはないけど動きが正しくない
など明らかに原因を探すのが難しいことになります
すでに関数があるエラーが出たほうが原因がわかりやすくていいですよね
まとめ
エラーが出るにせよ とりあえず上書き処理したほうがいいです上書きしなかったせいで思ってるのと動きが違う関数を実行したところで分かりづらいエラーかおかしな挙動をするだけです