LoginSignup
1

More than 5 years have passed since last update.

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

Posted at

はじめに

とある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ちゃんとつけましょうね。って話。

とほほ。。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1