javascriptをつかった実験。

print("hogehoge");
  //=> hogehoge

これは問題ない。

a=1;
function () {
    a=2;
}
print(a);
//=> 1

関数の中のaは参照されないみたいだ。

階乗の計算(n!)
function func(n) {
    if (n==0){
	return 1}
    else{
	return n*func(n-1)}
}
print(func(7))
    //=>5040

ここも、問題ない。

階乗の計算(末尾再帰
function func(n) {
    function func_tail(a,b) {
	if(b==0){
	    return a }
	else{
	    return func_tail((a*b),(b-1)) }
    }
    func_tail(1,n)
}
print(func(7));
//=> undefined

なぜか「undefined」何でなんだろ。
何かがおかしい?
上との違いは、funcitonの中でfunctionを使っていること。

あと、javascriptで気づいたこと

javascriptは関数が評価される順序が違う。
function a(){
    return "hoge"
	};
print(a())
    //=>fuga
function a(){
    return "fuga"
	}
print(a())
    //=>fuga

rubyだと、"hoge"の後に"fuga"なのだけれど、
javascriptは違うみたい。
関数は一度格納してから、実行されるのかな?
長いコードを書いているとき、同じ名前の関数を作ってしまったらピンチ!かも。

ちょっとした違いで大きな差

さっきの関数a

print(a)
    //=>function a(){
    //return "fuga"
    //}
print(a())
    //=>fuga

あれ、もしかして、変数aと関数aが結び付いている感じ?
調べてみる。これで結果が同じならそういうことかも

x=function(){
    return "fuga"
}
print(x)
    //=>function(){
    //return "fuga"
    //}
print(x())
   //=>fuga

あー、やっぱりおんなじだ。
なんか、記述の仕方はrubyと近いものがあるけど、
実装のされ方が結構違うかもしれない>javascript

追記

末尾再帰のところ、returnを忘れていた。
returnを書き忘れても気づかない >ruby
  あと、変数の前には var をつけるみたい