追記・修正(2017-10-01 18:55)
すみません、元コードの簡略化にセンスが無く、雑すぎました。
特に、「一応、これでも全く問題無く動きます」と書いた部分は、
「元のコード上では」という話で、ここに書いたものは何も動きません。
hogeやfooにも深い意味はありませんでした。申し訳ないです。
要点としては、下記のようになってしまっているコードを
上から下へ順番に読んでも自然な形にするにはどうすれば良いでしょうか、という質問でした。
javascript
1function move() { 2 init(); // ←ここ no-use-before-define 3} 4 5function init() { 6 move(); 7} 8
実はこれの元は、とあるJavaScript入門書籍のサンプルプログラムでして、Visual Studio Code上で整形してから読解・学習しているのですが、このパターンになりがちでトホホです。あまり良い本ではないと感じましたけど、VSCode+ESLintの練習には大活躍しました(苦笑)
今後、他人のプログラムを見たときに「このパターンはありえる」「攻略法を知っておきたい」と思い、こちらで質問させて頂きました。
(旧)
JavaScript勉強中、よく以下のようなパターンにハマってしまい、
ESLintの「no-use-before-define」に怒られてしまいます。
Javascript
1let TimeId; 2 3function move() { 4 if ( hoge ) { 5 clearInterval(TimeId); 6 } 7 if ( foo ) { 8 setTimeout(() => { 9 init(); // ←ここ no-use-before-define 10 }, 2000); 11 } 12} 13 14function init() { 15 TimeId = setInterval(() => { 16 move(); 17 }, 1000); 18} 19
(2017-10-01 18:55修正)
一応、(元のコード上では)これでも全く問題無く動いています。JavaScriptの仕様のおかげです。
だから「no-use-before-define」は「"functions": false」にしておけば
怒られずに済むわけですが、確かに言われてみると、流れ的に美しくない感じがします。
そこでinitを上に配置すると、今度はinitの中のmoveで怒られるわけです。
こりゃどうしたもんかと。
これを回避する基本パターンがあると思うのですが、思い付きません。
ご教授よろしくお願いいたします。
(余談)
このコード中、TimeIdでも悩まされた時期がありました。
最初は、先頭にlet TimeId宣言を置かず、
init内から「const TimeId = ~」でスタートして、
move(TimeId)にて引数で渡しても意図通りに動いてくれました。
しかしながら
move内のclearInterval(TimeId)で「TimeIdなんぞ知らん」とESLintに怒られまくり。
ただ、これについては今回のコードのように、先頭にlet TimeIdを置いて解決できました。
でも今回の問題は自力で解決策が見出せませんでした。よろしくお願いします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/01 10:29
2017/10/01 11:37
2017/11/30 20:44