JavaScriptのスコープがわかっていなくて無限ループ

More than 1 year has passed since last update.

はじめに

とあるSlacknにメッセージを出力するgsスクリプトにちょっと書き足したら出力が無限ループするようになりました。

なんで!?

無限にループするような処理など処理など書いていないのにどうしてこうなったのでしょう。

問題のコード

function myFunction() {
  for(i=0; i<10; i++){
    Logger.log('out i =' + i);
    child1();
  }  
}

function child1(){
  for(i=0;i<4;i++){
    Logger.log('in i =' + i);
  }
}

ログを見ると。。

[16-03-13 16:17:14:563 JST] out i =0
[16-03-13 16:17:14:564 JST] in i =0
[16-03-13 16:17:14:565 JST] in i =1
[16-03-13 16:17:14:566 JST] in i =2
[16-03-13 16:17:14:566 JST] in i =3
[16-03-13 16:17:14:567 JST] out i =5
[16-03-13 16:17:14:567 JST] in i =0
[16-03-13 16:17:14:568 JST] in i =1
[16-03-13 16:17:14:569 JST] in i =2
[16-03-13 16:17:14:570 JST] in i =3
[16-03-13 16:17:14:570 JST] out i =5

おーchild1()から戻ってくるとiがいつも4になっちゃって無限ループ!

ということで、 for(i=0;.. だとiがグローバル変数になって、内側の関数内のiも同じiを参照しちゃうんですってね。奥様。JavaScriptって普通に書くとブロックスコープにならないのね。

ってことで for(var i=0;... って書けば解決。
スコープわからないなら、、、というかいつもvarちゃんとつけましょうね。って話。

とほほ。。