どうも。つじけ(tsujikenzo)です。このシリーズでは2021年8月からスタートしました「ノンプロ研EffectiveJavaScript輪読会」についてお送りします。今日は第2回目です。
前回のおさらい
前回は、「ノンプロ研EffectiveJavaScript輪読会とは」ということで、準備運動をしました。
今回は、「どのJavaScriptをつかっているのかを意識しよう」 をお届けします。
テキスト第1章「JavaScriptに慣れ親もう」の項目1に対応しています。
今日のアジェンダ
- JavaScriptとECMAScript
- use strictモード
JavaScriptとECMAScript
本書の1ページ目に登場する「ブレンダン・アイク」こそ、JavaScriptの生みの親です。
2021年現在、御年60歳です。1995年、34歳のときにJavaScriptを開発しました。
JavaScriptが開発された背景には、インターネットの普及黎明期の需要があります。
今でこそ、インターネットを楽しむために使われているのは、ブラウザやスマートフォン、サーバーからWebアプリまでさまざまですが、当時、もっともインターネットのために使われたのは「ブラウザ」です。
IT企業は、自社製のブラウザのシェアを伸ばすことに必死でした。
特に争っていたのが、ブレンダン・アイク側のMozillaと、ECMA(European Computer Manufacturer Association:ヨーロッパ電子計算機工業会)インターナショナルです。
結局、ブラウザの覇権争いに勝ったのは「ECMAインターナショナル」だったのですが、商標権の問題で「JavaScript」という名称を使えませんでした。
なので、現在もっとも普及しているJavaScriptは 「ECMAScript2015(ES6)」 などという正式名称で呼ばれているのです。
このブログでもECMAScriptのことをJavaScriptと呼びます。
特段のことわりがない場合は、テキストに合わせて、JavaScriptのバージョンは「ES5」を指します。
use strictモード
VBAでは、変数宣言をしなくても、変数に値を代入し、実行できます。
Sub Sample()
Name = "tsujike"
MsgBox Name
End Sub
しかし、「型を決める」「変数名を決める」という意味で、変数は宣言すべきです。(詳細は割愛します)
VBAでは宣言セクションで、「Option Explicit」と書くと、以降、必ず変数を宣言しなければなりません。
必ず「Option Explict」宣言をし、変数宣言しましょう。
Option Explicit
Sub Sample()
Dim Name As String
Name = "tsujike"
MsgBox Name
End Sub
このような、スクリプトの先頭に書くことで、スクリプト全体に渡る決まりごとを設定する命令文が、JavaScriptにもあります。
それが 「”use strict”」 モードです。
strictとは「厳格な~」という意味ですが、何が厳格なのでしょうか。
主な厳格
1. 暗黙的なグローバル変数の禁止
2. 代入不可なプロパティへの代入の禁止
3. 削除できないプロパティの削除の禁止
4. 関数の引数名の重複の禁止
5. 幾つかの識別子は予約語にするため使用禁止(staticとか)
6. 8進数表記の禁止
7. eval 変数、arguments 変数の宣言禁止
8. with 禁止
他の章でも触れる項目もありますので、今回は「実務に使えそうな」いくつかを挙げてみます。
暗黙的なグローバル変数の禁止
GASは、var、let、const宣言をしなくて(忘れて)も、動きます。
function myFunction1_1_01() {
num = 10;
console.log(num); //10
}
これは、スコープ的にはvarを省略した状態です。
function myFunction1_1_01() {
{ num = 10 }
console.log(num); //10
}
letやconstは、ブロックスコープを生成する復習もしておきましょう。
function myFunction1_1_02() {
{ let num = 10 };
console.log(num); //ReferenceError: num is not defined
}
“use strict”モードは暗黙的なvar宣言を許しません。
"use strict";
function myFunction1_1_03() {
{ num = 10 };
console.log(num); //ReferenceError: num is not defined
}
関数の引数名の重複の禁止
GASでは、引数名が重複していても動きます。しかし、予期せぬ挙動を返します。(下記の場合では、第1引数が無視されているようです)
function myFunction1_1_04(value, value) {
return value + value;
}
console.log(myFunction1_1_04(1,10)); //20
“use strict”モードは、引数名の重複を許さず、構文チェック時にエラーがでます。(保存すらできません)
"use strict";
function myFunction1_1_05(value, value) {
return value + value;
}
console.log(myFunction1_1_05(1,20)); //構文エラー: SyntaxError: Duplicate parameter name not allowed in this context
ちなみに関数リテラルでは、そもそも引数名の重複を認めていません。
function myFunction1_1_06 () {
const getValue = (value, value) => value + value;
//構文エラー: SyntaxError: Duplicate parameter name not allowed in this context
}
テキストでは、「では、ファイルの連結をする場合はどうしたらいいだろうか」という課題の解決を、即時関数の紹介とともに提示していました。
しかしながら、GASではスクリプトファイルを連結することはありませんので、さらっと読む程度でいいかなと思いました。
まとめ
以上で、「どのJavaScriptをつかっているのかを意識しよう」をお届けしました。
ECMAScript という名称がなぜJavaScriptの正式名称なのかはっきりしましたが、実務への影響は少ないかもしれません。
use strictモードは、GASでも積極的に導入していいのではないかと思いました。
話は、JavaScriptのバージョンの排他的制御までいかなくても、「暗黙的なグローバル変数の禁止」「引数の重複を認めない」という2点だけでも利用価値があるかもしれません。
次回は、「JavaScriptの浮動小数点を理解しよう」 をお届けします。
参考資料
ノンプロ研定例会30『VBAvsGASvsPython』
strictモードで厳格なjavaScriptを書こう
このシリーズの目次
[EffectiveJavaScript輪読会]ノンプロ研EffectiveJavaScript輪読会とは
[EffectiveJavaScript輪読会]どのJavaScriptをつかっているのかを意識しよう
[EffectiveJavaScript輪読会]JavaScriptの浮動小数点を理解しよう
[EffectiveJavaScript輪読会]暗黙の型変換に注意しよう
[EffectiveJavaScript輪読会]オブジェクトラッパーよりもプリミティブが好ましい
[EffectiveJavaScript輪読会]型が異なるときに==を使わない
[EffectiveJavaScript輪読会]セミコロン挿入の限度を学ぼう
[EffectiveJavaScript輪読会]文字列は16ビットの符号単位を並べたシーケンスとして考えよう