[EffectiveJavaScript輪読会]どのJavaScriptをつかっているのかを意識しよう

GAS

どうも。つじけ(tsujikenzo)です。このシリーズでは2021年8月からスタートしました「ノンプロ研EffectiveJavaScript輪読会」についてお送りします。今日は第2回目です。

前回のおさらい

前回は、「ノンプロ研EffectiveJavaScript輪読会とは」ということで、準備運動をしました。

[EffectiveJavaScript輪読会]ノンプロ研EffectiveJavaScript輪読会とは
どうも。つじけ(tsujikenzo)です。このシリーズでは2021年8月からスタートしました「ノンプロ研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ビットの符号単位を並べたシーケンスとして考えよう

タイトルとURLをコピーしました