• 締切済み

他の関数内にあるsetinertvalを参照できな

clearInterval(timer0);が他の関数内にあるsetinertvalを参照できない。 エラーになってしまいます。 let startSlot = (()=> { let timer0 = setInterval(() => { 内容 }, interval); })(); // stopSlot let stopSlot = (()=> { const stop0 = document.getElementById('stop0'); const stop1 = document.getElementById('stop1'); stop0.addEventListener('click', ()=> { clearInterval(timer0); }); })(); 勝手にカプセル化してしまう スコープの問題に非常に悩むのですがどう対処しますか? よい回答を頂けないので、いろいろな所で聞いています。

みんなの回答

回答No.5

ついで。 師匠の名言集から1つ 「変更に強く、丈夫な(他者からの影響を受けない)プログラムを心がけなさい。」

回答No.4

#3です >クラスなら、すべての変数がグローバルになる いろいろと勘違いがあるようですが、説明が面倒なので割愛。 -- >スコープの問題に非常に悩む 一つの関数の中に詰め込めば、結果としてその中では変数を参照出きるのだから 実現したいのならそうすれば好い。 結果として1つのスコープの中で扱う変数は多くなる。さらにプログラムも長くなる。 それぞれの変数の関係を考慮するので、コーディングに時間を要する。 現にあなたはそうするだけで良いのに、それを悩んで質問をしている。 >関数とクラスの違いはこれだけ オブジェクト指向っぽい考え方は、可能な限り機能を細分化しておき、それらを継承もしくは組み合わせて複雑なものを構成していく。 細分化されるとプログラムは短くなる。早く作れる。 回答者側にクラスを継承してプログラムを書ける人は沢山いても、それほど複雑な質問はないしあったとしても面倒なので答えない。(質問者がアレな場合が多いし…想像だけどね) ましてやその便利さを伝えきれないし、理解しなくても用が済んでしまうプログラマが多いのでは? 小さくはない(巨大な)プログラムでも書いてみれば?(書いたことはないけれど) その有り難味がわかるのでは? -- >グローバル変数として定義するしかありません この言葉に意地になってしまった。(時間返せ~!と心の中で叫ぶ) -- あと訂正     this.timerId = clearInterval (this.timerId), null; を     this.timerId = (clearInterval (this.timerId), null); に、     doc.addEventListener ('click', this); を     doc.addEventListener ('click', this, false); に。

htmlcss123
質問者

お礼

あれな回答者ww

回答No.3

<!DOCTYPE html> <meta charset="utf-8"> <title>Slot</title> <style> table th { font-size: xx-large } </style> <body> <table border="1">  <tr>   <th>&nbsp;   <th>&nbsp;   <th>&nbsp;  <tr>   <td>    <input type="button" value="Start">   <td>    <input type="button" value="Start">   <td>    <input type="button" value="Start">  <tr>   <td>    <input type="button" value="Stop">   <td>    <input type="button" value="Stop">   <td>    <input type="button" value="Stop"> </table> <script> {  const   randomInt =    function (n = 10) {     return Math.floor (Math.random () * n);    },   disp =    function () {     let no = randomInt ();     this.no = no;     this.view.textContent = no;    },   init =    function () {     let doc = this.start.ownerDocument;     doc.addEventListener ('click', this);     disp.call (this);    };  class Slot {   constructor (view_emt, start_btn, stop_btn) {    this.view = view_emt;    this.start = start_btn;    this.stop = stop_btn;    this.timerId = null;    this.no = null;    init.call (this);   }   startSlot () {    if (! this.timerId)     this.timerId = setInterval (disp.bind (this), 100);   }   stopSlot () {    if (this.timerId)     this.timerId = clearInterval (this.timerId), null;   }   handleEvent ({target}) {    switch (true) {    case this.start === target :     this.startSlot ();     break;    case this.stop === target :     this.stopSlot ();     break;    }   }  }  this.Slot = Slot; } //_________ let  doc = document,  view = doc.querySelectorAll ('tr:first-of-type th'),  start = doc.querySelectorAll ('tr:nth-of-type(2) input'),  stop = doc.querySelectorAll ('tr:nth-of-type(3) input'),  cell = view.length,  ctrls = []; for (let i = 0; i < cell; i += 1)  ctrls.push (new Slot (view[i], start[i], stop[i])); </script>

htmlcss123
質問者

お礼

やはりクラスなら、すべての変数がグローバルになるのでアクセスがどこからでもできるのですね。 関数とクラスの違いはこれだけでしょうか? つまりこれ以外は関数と同じように使えば問題ないでしょうか?

  • t_ohta
  • ベストアンサー率38% (5238/13705)
回答No.2

> そうするとstartSlotという関数の呼び出しによる実行ができないですよね。 できますよ

  • t_ohta
  • ベストアンサー率38% (5238/13705)
回答No.1

timer0 をグローバル変数として定義するしかありません

htmlcss123
質問者

お礼

そうするとstartSlotという関数の呼び出しによる実行ができないですよね。 このような場合は再利用を飽きらめて、同じソースを何度も使うしかないのでしょうあk?

関連するQ&A