javascriptは確かに変わった言語なのかもしれない。

javasriptはjavaに似せたまったく異なる言語。

普通なら指定した数の引数で関数を呼ばなくちゃいけないのに

こんな風に書くことができる。

function sum(){//何も引数を取らない関数?
	return Array.reduce(arguments,function(x,y){return x+y});
}
print(sum(1,2,3,4)) //10

argumentsってなんだろ?

実際のところ、関数を定義する時の仮引数はあまり重要じゃないのかもしれない。
こうゆう関数は

function f(a, b, c){
	...
}

以下と同じなのかもしれない。

functon f(){
	a = arguments[0];
	b = arguments[1];
	c = arguments[2];
	...
}

実行時の引数が仮引数のa,b,cに渡されるんじゃなくて、
関数を実行したときすべての引数がargumentsという配列のようなものに格納される。
そして、それが仮引数で定義されたa,b,cに代入(束縛)されるような感じなのかも