JavaScript習得への道は遠い。
高木です。おはようございます。
昨日も書いたように、重い腰を上げてJavaScriptの勉強を本格的に始めました。
実際に勉強を始めてみると、想像していたよりはるかに難しいことがわかります。
おそらく、安心して使いこなせるようになるまで、少なく見積もっても1年はかかりそうです。
何が難しいかというと、標準規格のバージョンが毎年のように上がる上、方言も多く、しかも方言の多くに同時に対応しないといけないことです。
私が普段よく使っているC++の場合、標準規格のバージョンは実質4つであり、相手にするコンパイラも実質4つ(GCC、Clang、Visual C++、EDG)です。
JavaScriptはそれと比べてもはるかに多くの方言があります。
JavaScriptの勉強を進めていくにつれ、昨日書いたように疑問点は次々解消していってはいます。
ローカル変数のスコープあるいは生存期間にしても、varではなくletやconstを使えばブロックスコープが実現できることも学びました。
現在主流のブラウザやnode.jsの対応状況をみても、ECMAScript 2015(ES6)以上を想定することに大きな問題はなさそうです。
http://kangax.github.io/compat-table/es6/
昨日あたりから『Effective JavaScript』を読み始めたのですが、そこで知ったことに”use strict”があります。
いかにも場当たり的な機能ですが、互換性を考えると致し方ないのでしょう。
少なくとも”use strict”を徹底することで方言の問題は多少軽減できそうです。
ただ、”use strict”に関しては、非常に汚い(「おぞましい」といってもいいような)バッドノウハウがあるようですね。
スクリプトを連結しても確実に”use strict”を有効にするためにファイル全体を即時関数で囲むとか、私の想像を超える汚さでした。
1 2 3 4 5 6 | (function() { "use strict"; /* スクリプト本体 */ })(); |
『Effective JavaScript』は2013年の書籍であり、当時のECMAScriptの最新版はES5でした。
ですので、もしかしたら新しいバージョンでは”use script”をブロックの先頭で書いても有効になるかも? と淡い期待を抱きました。
実際に実験してみましたが、そんなはずもなく、やはり即時関数でどうにかする以外になさそうです。
ECMAScript 2015で導入されたアロー関数の先頭でも”use strict”を書くことはできるようです。
それなら先ほどのバッドノウハウも次のように書けます。
1 2 3 4 5 6 | (()=>{ "use strict"; /* スクリプト本体 */ })(); |
こう書けたから何かうれしいのかといわれれば、決してそんなことはありません。
むしろ汚さが増したと感じるのは私だけでしょうか?