オブジェクトをディープクローンするとき 中に関数があるとどうするか困るのが関数
プリミティブ値はそのままで 配列とオブジェクトはプロパティを再帰的にコピーでなんとかできる
でも関数はどうするのがいいかベストな方法がわからない

考えられるのは

◯ そのまま
◯ 文字列から再作成
◯ 元関数を通すだけの関数を作る

関数自体の機能はイミュータブルなのでそのまま参照をコピーするだけで基本は大丈夫
でもオブジェクトだからプロパティがあって それが使われてる場合はクローン後の関数のプロパティを書き換えたら元の関数のプロパティも変わってしまう

ちゃんとクローンするなら toString の文字列を元に eval などで再作成
パフォーマンスが悪そうなのと静的スコープが維持されないので外部を参照してると動かなくなるなど問題もある

だから新しく同じ処理をする関数を作るのじゃなくて クローン元の関数を実行するという関数を作る
プロパティを引き継ぐために プロパティだけは通常のオブジェクトと同じようにクローンする
呼び出しの階層が 1 つ深くなるくらいしかデメリットもないし ちゃんとクローンするのならこの方法が一番いいのかな