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

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

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

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

jQuery

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

Q&A

解決済

2回答

726閲覧

変数のスコープ範囲について

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

jQuery

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

0グッド

1クリップ

投稿2019/09/23 06:29

Javascript

1 var resizeTimer = null, 2 $a = $('#section_a'), 3 $b = $('#section_b'), 4 $c = $('#section_c'), 5 aTop, a_contentTop, bTop, b_contentTop, cTop, c_contentTop; 6 console.log(a_contentTop); 7 $('#next_a').on('click', function() { 8 $('body,html').animate({ 9 scrollTop: aTop 10 }, 800, autoscroll_a); 11 }); 12 13 $('#next_b').on('click', function() { 14 $('body,html').animate({ 15 scrollTop: bTop 16 }, 800, autoscroll_b); 17 }); 18 19 $('#next_c').on('click', function() { 20 $('body,html').animate({ 21 scrollTop: cTop 22 }, 800, autoscroll_c); 23 }); 24 25 $('#top').on('click', function() { 26 $('body,html').animate({ 27 scrollTop: 0 28 }, 800); 29 }); 30 31 function autoscroll_a() { 32 setTimeout(function() { 33 $('body,html').animate({ 34 scrollTop: a_contentTop 35 }, 300); 36 }, 800) 37 console.log(a_contentTop); 38 } 39 40 function autoscroll_b() { 41 setTimeout(function() { 42 $('body,html').animate({ 43 scrollTop: b_contentTop 44 }, 300); 45 }, 800) 46 } 47 48 function autoscroll_c() { 49 setTimeout(function() { 50 $('body,html').animate({ 51 scrollTop: c_contentTop 52 }, 300); 53 }, 800) 54 } 55 56 //位置取得 57 var delay = 0 58 $(window).on('load resize', function() { 59 clearTimeout(resizeTimer); 60 resizeTimer = setTimeout(function() { 61 62 var hSize = $(this).outerHeight(); 63 $('.first_btn,.title,.content').height(hSize); 64 aTop = $a.offset().top; 65 a_contentTop = $a.find('.content').offset().top; 66 bTop = $b.offset().top; 67 b_contentTop = $b.find('.content').offset().top; 68 cTop = $c.offset().top; 69 c_contentTop = $c.find('.content').offset().top; 70 console.log(a_contentTop); 71 72 }, delay); 73 delay = 200; 74 }); 75コード

先日からこのサイトで何度か質問させて頂いているのですが、
追加でアニメーションを加えたく、offset().top;の値を取得したかったのですが、スコープの範囲を理解できないようです。

上記のコードの中の4箇所にそれぞれ console.log(a_contentTop); を入れてみて変数のスコープ範囲を調べてみたのですが、
いまいちピンときませんでした。

※入れた個所を1~4で分け、それぞれに **「←ここ」**で印を付けています。

1

1var resizeTimer = null, 2 $a = $('#section_a'), 3 $b = $('#section_b'), 4 $c = $('#section_c'), 5 aTop, a_contentTop, bTop, b_contentTop, cTop, c_contentTop; 6 console.log(a_contentTop); ←ここ 7コード

2

1$('#next_a').on('click', function() { 2 $('body,html').animate({ 3 scrollTop: aTop 4 }, 800, autoscroll_a); 5 console.log(a_contentTop); ←ここ 6 }); 7コード

3

1function autoscroll_a() { 2 setTimeout(function() { 3 $('body,html').animate({ 4 scrollTop: a_contentTop 5 }, 300); 6 }, 800) 7 console.log(a_contentTop); ←ここ 8 } 9コード

4

1var delay = 0 2 $(window).on('load resize', function() { 3 clearTimeout(resizeTimer); 4 resizeTimer = setTimeout(function() { 5 6 var hSize = $(this).outerHeight(); 7 $('.first_btn,.title,.content').height(hSize); 8 aTop = $a.offset().top; 9 a_contentTop = $a.find('.content').offset().top; 10 bTop = $b.offset().top; 11 b_contentTop = $b.find('.content').offset().top; 12 cTop = $c.offset().top; 13 c_contentTop = $c.find('.content').offset().top; 14 console.log(a_contentTop); ←ここ 15 16 }, delay); 17 delay = 200; 18 }); 19コード

まずは4からです。

ここでは関数内で、変数 a_contentTop$a.find('.content').offset().top; という値を代入しているので
その関数内で変数を呼び出せているという事は何となく理解できます。

次に1です。
ここが理解できていないのですが
4で値を代入した変数を1で呼び出しているのですが、
1でconsole.log(a_contentTop);をしても値がundefinedになります。
つまり値が未定義の状態だという事です。

なのにもっと分からないのが、2と3ではclickイベント発火時に **console.log(a_contentTop); **が呼び出せています。

自分でも参考書を読んだり、サイトで検索しているのですが
今回のコードの参考となる情報は見つかりませんでした。

もっと理解を深めていきたいので、ここを勉強した方が良いなどの情報がありましたら
教えて頂けるとありがたいです。

宜しくお願いします。

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

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

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

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

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

guest

回答2

0

ここを勉強した方が良い

https://ja.javascript.info/

投稿2019/09/23 06:34

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/09/23 06:51

ありがとうございます。 参考にさせて頂きます。
guest

0

ベストアンサー

4で値を代入した変数を1で呼び出しているのですが、

コードの実行される順番にを考えましょう。1を実行する時点では、4はまだ実行されていませんので、初期値のundefinedのままとなっています。

2や3では、4で実行された後にクリックが行われれば、変数の値を使うことができます。

投稿2019/09/23 06:33

編集2019/09/23 06:34
maisumakun

総合スコア145184

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

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

退会済みユーザー

退会済みユーザー

2019/09/23 06:50

早速のご回答ありがとうございます。 1を実行する時点では、4はまだ実行されていないという事は loadとresizeが行われていないという事でしょうか? 何かイベントが発生しないと関数内のローカル変数の値は使えないという事でしょうか? 1と2,3の違いがクリックイベントだという理解しかないのでいまいち分からないです。 申し訳ございません。
退会済みユーザー

退会済みユーザー

2019/09/23 06:57 編集

var resizeTimer = null, clearTimeout(resizeTimer); resizeTimer = setTimeout(function() {ここに4の変数}, delay); delay = 200; 1が実行されていない原因は4のloadを遅延させているの為でしょうか?
maisumakun

2019/09/23 06:55

> 1を実行する時点では、4はまだ実行されていないという事は loadとresizeが行われていないという事でしょうか? はい、1は4のイベントをセットするより前に実行されるコードですので、1のほうが先に実行されます。 仮に1の実行時点でloadイベントが済んでいたとすれば4のコードは実行すらされないことになりますが、現実にはloadイベントは画像などすべてのリソースの読み込みを待つので、1の実行より後にイベント発生します。
maisumakun

2019/09/23 06:55

delayは無関係です。
maisumakun

2019/09/23 06:59

> 何かイベントが発生しないと関数内のローカル変数の値は使えないという事でしょうか? いえ、そんな事はありません。1の箇所で値を代入すれば、それ以降のコードからそのまま利用できます。
退会済みユーザー

退会済みユーザー

2019/09/23 07:23

ありがとうございます。 大変勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問