LoginSignup
0
0

More than 3 years have passed since last update.

変数参照の遅延

Last updated at Posted at 2020-05-24

解決

グローバルスコープでも以下のように修正して解決しました。
"/3[0-9]/g" → "/3[0-9]/"で解決しました。

問題

変数regをグローバルスコープに設定

sample.js

 let reg = /3[0-9]/g;


for(let i = 1; i < 101; i++) {



    if(reg.test(i)) {

        console.log(i + "は10の位が30の数字だよ!!");

    } else if(i % 3 == 0 ) {

       console.log(i + "は三で割り切れるよ!!");

    }else {

        console.log(i);
    }

}

結果


30は10の位が30の数字だよ!!
31
32は10の位が30の数字だよ!!
33は三で割り切れるよ!!
34は10の位が30の数字だよ!!
35
36は10の位が30の数字だよ!!
37
38は10の位が30の数字だよ!!
39は三で割り切れるよ!!

ローカル変数iの10の位が30の時に所々、期待した出力値が出ない。
例( i = 31の時"31は10の位が30の数字だよ!!"と出力されて欲しいが"31"と出力される。)

原因はforループの処理速度にによるグローバル変数regを参照する速度が追いついていないのか?
と考えたので変数regをブロックスコープに設定。
※javascriptには"スコープチェーン"と言う概念がある。
この概念によると、javascriptは狭いスコープに位置する変数を優先して参照するらしい。

sample.js




for(let i = 1; i < 101; i++) {

  let reg = /3[0-9]/g;

    if(reg.test(i)) {

        console.log(i + "は10の位が30の数字だよ!!");

    } else if(i % 3 == 0 ) {

       console.log(i + "は三で割り切れるよ!!");

    }else {

        console.log(i);
    }

}

結果

30は10の位が30の数字だよ!!
31は10の位が30の数字だよ!!
32は10の位が30の数字だよ!!
33は10の位が30の数字だよ!!
34は10の位が30の数字だよ!!
35は10の位が30の数字だよ!!
36は10の位が30の数字だよ!!
37は10の位が30の数字だよ!!
38は10の位が30の数字だよ!!
39は10の位が30の数字だよ!!

PS

やはり変数の参照速度の遅延が原因なのか??
わかる方、是非ご教授ください。

0
0
3

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
0
0