質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

3849閲覧

js foreach内の変数

Koyyyyyy

総合スコア55

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/06/20 01:52

今 react natice で開発をしているのですがJSの変数のスコープに苦しめられております。

foreach内で使用した変数をその外で使いたいのですがスコープによって使えません。

この様な場合どの様にするのがベストなのでしょうか。

countNumberという変数を一番下のif文でも使いたいのですがこのままだと一番下のif文のcountNumberは常に0になってしまいます。

var countNumber = 0; firebaseRef .on("value", function(snapshot) { snapshot.forEach(function (childSnapshot) { // var countNumber = 0; const childData = childSnapshot.val(); const savedUserId = childData.userId; if (loginUserId === savedUserId ){ countNumber += 1 } }) }); if (countNumber === 0){ this.setState({ isModalVisible: !this.state.isModalVisible }); console.log(this.state.isModalVisible); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/06/20 02:10

「React.js」もタグに入れておいてください。
guest

回答2

0

ベストアンサー

JSの変数のスコープに苦しめられて

↑スコープの問題ではありません。

var countNumber = 0; firebaseRef .on("value", function(snapshot) { // <-- イベントハンドラに処理を登録しているだけです。 snapshot.forEach(function (childSnapshot) { // var countNumber = 0; const childData = childSnapshot.val(); const savedUserId = childData.userId; if (loginUserId === savedUserId ){ countNumber += 1 } }) }); // ↓登録処理が終わった直後にここが実行されます if (countNumber === 0){ this.setState({ isModalVisible: !this.state.isModalVisible }); console.log(this.state.isModalVisible); }

投稿2018/06/20 02:17

tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Koyyyyyy

2018/06/20 02:23

素早い返信ありがとうございます! なんとなくわかりました! ということは一番下のif文の条件でcountNumberがずっと0になってしまう理由とは何でしょうか。 質問が被っている様ですいません。
tkturbo

2018/06/20 02:29

宣言部でcountNumberに0をセットしている→イベントハンドラに処理を登録している(処理自体は実行されていない)→登録処理後もcountNumberの値は0のまま。 回答内容と同じことですが。
Koyyyyyy

2018/06/20 02:32

イベントハンドラを実行された後に一番下のif文を実行するにはどうすればいいのでしょうか。
tkturbo

2018/06/20 03:16

> イベントハンドラを実行された後に一番下のif文を実行するには イベントハンドラの末尾に入れる、というのが解のような気がします。 # イベント実行ごとに必ず実行されてしまいますが。
guest

0

JavaScript

1 var countNumber = 0; 2 3 4 firebaseRef 5 .on("value", function(snapshot) { 6 snapshot.forEach(function (childSnapshot) { 7 // var countNumber = 0; 8 const childData = childSnapshot.val(); 9 const savedUserId = childData.userId; 10 if (loginUserId === savedUserId ){ 11 countNumber += 1 12 } 13 }) 14 if (countNumber === 0){ 15 this.setState({ isModalVisible: !this.state.isModalVisible }); 16 console.log(this.state.isModalVisible); 17 } 18 }); 19

"value" イベント発生時にループ回したりsetStateしたいのであれば、上記のような記述になります。
元のコードだと "value" イベント発生を待たずに "if (countNumber===0)" のIFブロックが評価されてしまい、その結果countNumberが常にゼロということになります。

ご参考になれば。

投稿2018/06/20 02:29

tkanda

総合スコア2425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問