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

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

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

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

Q&A

解決済

2回答

186閲覧

コードの実行順序について

newyee

総合スコア213

JavaScript

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

0グッド

0クリップ

投稿2018/09/19 11:09

編集2018/09/19 11:10

javascript

1document.addEventListener('DOMContentLoaded',function(){ 2 //指定された要素elemがクリックされた回数をカウントするCounterクラス 3 var Counter = function(elem) { 4 this.count = 0; 5 this.elem = elem; 6 elem.addEventListener('click',() => { 7 this.count++; 8 this.show(); 9 10 11 },false); 12 }; 13 14 Counter.prototype.show = function() { 15 console.log(this.elem.id + 'は' + this.count + '回クリックされました。'); 16 } 17 // <button>要素btnにカウンターをひも付け 18 var c = new Counter(document.getElementById('btn')); 19 20 21},false); 22

上記コードに関しまして、お聞きしたいことがあるのですが、「var c = new Counter(document.getElementById('btn'));」ここの部分において、idタグのbtnをCounterオブジェクトへ渡していると思うのですが、クリックイベントが発生した時の処理コード「elem.addEventListener」関数はインスタンス化する前に記述されています。考えすぎなのかもしれないのですが、今回ご質問させて頂いたように、コードの実行順序としましては、「btn」要素を取得する前にクリックイベントの処理コードが記載されていた場合だと、どの要素に対してのクリックイベントか認識できないのではないかと思ったんですよね。
どなたか、上記コードの実行順序などの点に関しまして、ご解説頂けましたら幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

結論から申し上げますと、杞憂にございます。

以下に、質問者様のコードと(ログを出力する以外は)等価なコードを乗せました。

javascript

1console.log(0); // 当然ここから処理開始 2document.addEventListener('DOMContentLoaded',function(){ 3 console.log(1); // HTML の DOM 要素がすべて読み込まれた後、ここが実行される。 4 var Counter = function(elem) { 5 console.log(3); // 既に elem (id=btn) は読み込まれている 6 /* もしこの段階で要素をクリックしても、まだ反応しない */ 7 this.count = 0; 8 this.elem = elem; 9 elem.addEventListener('click',() => { 10 console.log('クリック後の 0'); // クリックされるまで実行されない 11 this.count++; 12 this.show(); 13 },false); 14 }; 15 Counter.prototype.show = function() { 16 console.log('クリック後の 1'); 17 console.log(this.elem.id + 'は' + this.count + '回クリックされました。'); 18 } 19 /* 判りやすくするため、引数の外に出したが、動作順序は変わっていない */ 20 const btn = document.getElementById('btn'); 21 console.log(2); // 定義されただけの関数の中身はまだ実行されていない 22 var c = new Counter(btn); 23},false);

上記コードの出力結果は、以下になります。
("(ここでクリック)" は出力されません)

0
1
2
3
(ここでクリック)
クリック後の 0
クリック後の 1
btnは1回クリックされました。

関数の中身が実行されるのは、その関数が呼び出されたときなので、
以下のコード

elem.addEventListener('click', () => { ... }, false);

が実行されるのは、上記コードの、console.log(2) の後になります。
つまり、要素は取得済みです。

質問者様のオリジナルのコードでは document.getElemenetById('btn') の結果が直接コンストラクタの引数に与えられていますが、それでも実行順序は同じで、先に引数に与える式の計算を行ってからCounter のインスタンス化が始まるので問題になりません。

投稿2018/09/19 11:37

R.Mizukami

総合スコア1086

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

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

newyee

2018/09/20 10:55

分かりやすくご解説頂きありがとうございます。 「console.log(2)」が「console.log(3)」より先に実行されるということは、Counterオブジェクトは定義されている段階では、中身が読み込まれることはなく、 「var c = new Counter(btn);」ここの時点で、コンスタラクターが作動し、「btn」要素が引数として与えられ、「elem.addEventListener」関数の前までの処理が実行される、といった流れだと思うのですが、合っていますでしょうか?
R.Mizukami

2018/09/20 11:37

そのとおりです。関数やコンストラクタの定義段階でその中身が影響を与えることはありません。
newyee

2018/09/20 11:49

ありがとうございます。
guest

0

Counter.prototype.show が定義される前に click() されたなら、当然、TypeError になりますが、new Counter された時点では定義済なので、その心配は杞憂かと。

Re: newyee さん

投稿2018/09/19 11:21

think49

総合スコア18162

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問