ドットインストール「JavaScriptでストップウォッチを作ろう」をやった

f:id:tsuzuki670:20181230233855p:plain
https://dotinstall.com/lessons/stop_watch_js_v4

  • buttonというHTML要素がある。
  • JavaScriptは文と式からなる。文は「処理を実行するステップ」、式は「値を生成し、変数に代入できるもの」であり、評価値を返す。
    • 文を式として扱うことはできないが、式を文として扱うことはできる(式文と呼ぶ)。
    • 文の末尾にはセミコロンが必要。ただしブロック文の末尾にはセミコロン不要。(if文など。ブロックの終わりで文が終わることが明白だからかな?)
  • functionという語から始まるコードのうち、単に関数を宣言するのはfunction「文」、無名関数を変数に代入して関数リテラルをつくったりするのはfunction「式」。

参考:文と式 · JavaScript Primer #jsprimer

  • JSコード全体を1つの関数として括り、即時実行する。これによって変数のスコープがこの関数内に限られ、ライブラリなど他所から呼び出したコードと変数名が競合することを避けることができる。これを即時関数という。
    • function(){...}()と書くとfunction文として認識され、ブロックが終わった時点で文が区切られてしまう。
    • (function(){...})()と書くとfunction式として認識され、途中で区切られず、即時関数として期待される挙動をしてくれる。

参考:即時関数(function(){ ... })()の別の書き方いろいろ: Architect Note

  • setTimeoutは一定時間経過後に特定の処理を1回だけ行う。setIntervalは一定時間おきに特定の処理を繰り返す。
  • 一定時間おきに特定の処理を繰り返したい場合、以下の2つの方法がある。
    • setIntervalを利用する。この場合、処理開始時点から一定時間経過後に次の処理が開始されてしまうため、1つの処理がインターバル以上の時間を要してしまうと、実行すべき処理がどんどん積みあがってしまう。
    • setTimeOutを再帰的に呼び出すことでも一定時間おきの繰り返し処理を実現できる。こちらは処理終了時点から一定時間経過後に次の処理を開始する。そのため、1つの処理に長い時間がかかった場合、次の処理は呼び出されず、実行すべき処理がどんどん積みあがることはない。こっちの方がベターですね。

参考:JavaScriptでsetTimeoutを使う方法【初心者向け】 | TechAcademyマガジン

  • JavaScriptでは除算演算子”/"は小数を返す。商の整数部分のみ得たい場合はMath.floor(X / Y)
  • 桁数を固定するには、0を先頭にくっつけてから下X桁を取り出す方法が便利。1桁だったら~とかいちいち判定処理してたら重そうだもんな。
  • スタートボタンを押して経過秒数を表示させる場合、①開始時刻を取得する関数、②一定時間経過後に経過時刻を取得する関数(再帰で呼び出して繰り返す)、③取得したミリ秒を固定ケタ数の分/秒/ミリ秒に変換して表示する関数、の3つくらいに分ける。これくらいの粒度で関数を切り出していくのだなあ。(どれだけ共通してつかうかとかによるだろうけど。)
  • setTimeoutやsetIntervalの返り値は1とか2とかになる。これをtimeoutIDなどとして変数に入れておき、clearTimeout(timeoutID)とすると、タイマーを解除して、タイマーにより予定されていた処理を取り消すことができる。

参考:window.clearTimeout - Web API | MDN

  • 上下中央に文字を配置するには、heightとline-heightを同じ値にするなど。
  • 不具合の修正、地道だけどおもしろいな。
  • AtomのCtrl+Dめっちゃ便利!次にでてくる同じワードをマルチ選択。
  • 横並びの各要素に間隔を空けたい場合は、隣接セレクタでmargin-leftを指定するなど。いや、flexboxのjustify-content: space-between;でよろしくやってくれる。flexbox最高だなあ。
  • classの着脱はclassNameよりclassListの方がぐっと便利な感じがする。
  • めっちゃ冗長なコード書いて何とも思ってなかった…。DRY! DRY!