Javascriptで同じ名前の関数を再定義
同じ空間内で同じ名前の関数を定義しても、後のほうに定義した関数が元の定義を上書きする。
コード例
function f() { alert('before'); } function f() { alert('after'); } f(); //after
んでこれ実験して初めて知ったのだけど、どの時点でもf();を呼んだら after が表示されるのね。
つまりコードを実行する前に関数の定義がエンジンに登録されるわけだ。
f(); //after function f() { alert('before'); } f(); //after function f() { alert('after'); } f(); //after
これを活用してある程度汎用的なロジックをJSファイルに記述して、一部だけロジックの修正をしたい場合に各ページごとに関数の定義を上書きして使うというStrategyパターンみたいなことができるようになる。
言語的にオーバーロードはできないので同じ名前ならば引数が違えど定義が上書きされる。
f(); //after function f() { alert('before'); } f(); //after function f(args) { alert('after'); } f(); //after
オーバーロードを使いたい場合は関数内で暗黙的に作成されるオブジェクト、argumentsを用いる。
function f() { if(arguments.length == 1) alert("arguments.length = 1 v1:"+arguments[0]); else if(arguments.length == 2) alert("arguments.length = 2 v1:"+arguments[0]+" v2:"+arguments[1]); } f('value'); //arguments.length = 1 v1:value f('value1','value2'); //arguments.length = 2 v1:value1 v2:value2