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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

15495閲覧

【jquery】if 内での変数取得が、var でなければできない理由とは?

marimon

総合スコア32

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2019/05/06 19:29

編集2019/05/06 19:31

宣言(constletver)の違いについて知りたいです。

スコープの範囲についての一般的な説明は一読したつもりですが、整合しない問題にぶつかってしまいました。

下記問題が発生する理由がご説明できる方はいらっしゃいますでしょうか?

###発生している問題
「クリックしたdata」を取得し、「関数sample(clicked_sample)」に送り、ifで条件分岐しています。

この条件分岐のところで、「変数mes」が取得できません。

しかし、宣言をconstletでなく、varにすれば取得できます。

これはどのような理由によるのでしょうか?

html

1<button type="button" data-sample="question">question</button> 2<button type="button" data-sample="answer">answer</button>

script

1$(function(){ 2 3function sample(clicked_sample){ 4 console.log('クリックしたのは' +clicked_sample+ 'です'); 5 if( clicked_sample == 'question' ){ 6 const mes = '質問です'; 7 }else if( clicked_sample == 'answer' ){ 8 const mes = '回答です'; 9 } 10 console.log(mes); // ここで mes を取得したければ var で宣言しなければならないのはなぜ? 11} 12 13$('button').click(function() { 14 const clicked_sample = $(this).attr('data-sample'); 15 sample(clicked_sample); 16}); 17 18}); 19

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

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

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

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

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

guest

回答2

0

constlet はブロックスコープのため、中括弧でくくられた外からは参照できません。
ご提示のコードでは、 if 文の中のブロックで宣言されているため、 mes 変数のスコープが各条件分岐内のみとなり、宣言された次の行でスコープから出てしまっています。

一方で var で宣言された変数は関数内全体がスコープとなるため、この例では sample() 関数内全域で参照することができるため期待した動作になります。

以下のように修正すれば let を利用しても動くと思います。

javascript

1function sample(clicked_sample){ 2 console.log('クリックしたのは' +clicked_sample+ 'です'); 3 let mes = null; // if文の外で宣言する 4 if( clicked_sample == 'question' ){ 5 mes = '質問です'; 6 }else if( clicked_sample == 'answer' ){ 7 mes = '回答です'; 8 } 9 console.log(mes); 10}

投稿2019/05/06 21:28

R.Mizukami

総合スコア1086

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

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

marimon

2019/05/07 03:33

できたりできなかったりしていままで悩んでいたのですが、yambejpさんのおっしゃる法則でやっと理解できました。R.Mizukamiさんの正しいソースコードにも感謝です!ありがとうございます。
guest

0

ベストアンサー

ブロックスコープは外から持ち込めるけど中から持ち出せません

javascript

1const a=1; 2if(true){ 3 console.log(a); //外から持ち込んで1 4} 5if(true){ 6 const a=2; 7 console.log(a); //中で宣言したので2 8} 9console.log(a); //中の宣言は無視されて1

ただし配列など、内容を変更できるものは別です

javascript

1const a=[1]; 2if(true){ 3 console.log(a); //外から持ち込んで[1] 4} 5if(true){ 6 a[0]=2; //外から持ち込んだものの中身を書き換えて 7} 8console.log(a); //内側の処理が反映されて[2] 9if(true){ 10 const a=[3]; 11 console.log(a); //中で宣言したので[3] 12} 13console.log(a); //中の宣言は無視されて[2]

投稿2019/05/07 00:44

yambejp

総合スコア114843

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

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

marimon

2019/05/07 03:31

>外から持ち込めるけど中から持ち出せません なるほど!求めていたお答えです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問