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