jk-meets-js

恋に落ちるコード.js [技術系コメディ/短編/連載中]

This project is maintained by 8novels

恋に落ちる宣言 -Y’all, I’ve fallen in love!-

「|絵子《えこ》、私はBL物が好きだ」
「2話冒頭から衝撃のカミングアウトきたね」
「というわけで今日は変数の宣言の話だ」
「変数の宣言、ってそういう意味だったっけ? カミングアウトすることだっけ?」

 放課後、|情報処理《JS》部の部室。
 いつものごとく|瀬尾絵子《せのおえこ》と|篠宮樹里《しのみやじゅり》の二人が部活動に勤しんでいる。

「じゃあ、いつものようにJavaScriptで表現してみよう」
 と、樹里は部の備品であるMacBookでお気に入りのテキストエディタを起動し、入力する。

var eko = "fujoshi";

「……ちょっと待って」

 絵子の拳が勢い良く振り下ろされた。MacBookが2センチ宙を舞い、ペン立てが二つ同時に倒れる。

「なんで変数の名前がekoなのよ。宣言したのあんたでしょ」
「この構文では、変数ekoを宣言し、『fujoshi』という文字列を代入したわけだ」
「聞いてる? だから変数の名前がおかしい、ってば」
「ちなみに、JavaScriptの変数にはあらゆる文字、ドル記号($)、アンダースコア(_)が使える。ただし数字は先頭には使えない」
「ルールに合ってるかどうか聞いてんじゃないのよ。まずjuriに直せ、つってんの」
「使えるのはあくまで『文字』だ。要は記号以外なら実は日本語だって使えるから、こう書いてもいい」

var 絵子 = "fujoshi";

「ほんとだ、エラーにならない……だから『樹里』でしょうよ、そこ。書き直したんならそこも直してよ」
「で、JavaScript……というか、一般的なプログラミングにおいて『変数の宣言』とは、文字列とか数値といったデータを入れておくための『箱』に名前をつける、ということを意味している」
「あ、もう次の話題に進んでるのね……」
「他の言語だと、同時にデータ型も指定する必要があるんだが。これは文字列用の箱だ、とか、数値用だ、とか。ただ、JavaScriptの場合はデータの内容に応じて柔軟に箱の形を変えてくれる」
「気がきくヤツなのね」
「で、その箱にデータを入れることを『代入』。箱に入ったデータを呼び出して使うことを『参照』と呼ぶ」
「この行き場のない怒りもぜひ参照して欲しいんだけど」

 倒れたペン立てを戻しながら絵子はため息をつく。

「さてさて。この変数の宣言において重要なのが、『スコープ』という概念。すなわち、その宣言がどこまでの範囲で通用するのか、ということ」
「ちょっと難しくなったわね。言ってることが」
「絵子の唇は私だけのものだ」
「…………え、ちょ、ちょっと。なな何言ってるの、あの」

 思わぬ言葉に動揺した絵子はまたペン立てを倒す。その顔は耳まで真っ赤だ。

「……という言葉をこの場で言っただけなら、二人の間でだけ通用する。全校集会で宣言すれば、この校内で通用する。『おかえりなさ〜い』の街角メッセージのコーナーで宣言すれば、福井県全域で通用することになるな」
「……びっくりさせないでよ、もう。あと話題がローカルすぎるわ」
「では、これも実例を挙げて説明しよう」

var 絵子 = "fujoshi";
console.log(絵子);

「……まだ続くの? 私の|謂《いわ》れなき疑惑」
「そろそろ受け入れなさい。で、このコードを実行すると『fujoshi』という文字列が出力される」
「まあ、当然と言えば当然だよね。実行結果は、だけど」
「このコードをもうちょっと細かく説明するとだな。『絵子』っていう変数がグローバルスコープ、つまりプログラム全体から参照できる変数として宣言されている。絵子の趣味嗜好は白日の下に晒されていることになるわけだ」
「ほんと、イヤな言い方するね」
「じゃあ、これを踏まえて次」

var 絵子;
function comingout() {
    絵子 = "fujoshi";
}
comingout();
console.log(絵子);

「これもさっきと同じ、『絵子』はグローバル変数として宣言されている。だから、comingoutという関数の中、つまりはローカルな環境からでも、変数『絵子』に値を代入できるわけだ。結果、絵子の趣味嗜好は無事に露呈する」
「その『無事』っていうのが意味わかんないんだけど。プログラムの動きはわかったけど」
「はい。じゃあ次」

function comingout() {
    var 絵子 = "fujoshi";
}
comingout();
console.log(絵子);

「今までと違い、『絵子』は関数の中だけで使える変数、いわゆるローカル変数として宣言されている。これを実行すると……」
「……エラーになった。絵子 is not definedだって」
「このように、関数の中で宣言された変数は、関数の外からは認識することができない。スコープ外である、という言い方もよくされる。絵子の秘密は守られたわけだ」
「秘密というか、誹謗中傷のレベルだけどね……ところでさ」

 散らばったボールペンを元に戻しながら絵子が質問する。

「JavaScriptで変数を宣言する時は、昔からvarで宣言してたじゃない。でも最近、letで宣言するコードをよく見るんだけど」
「おお、いいところに気が付いたな」

 樹里が嬉しそうな顔で答える。

「2015年に発行されたECMAScript 2015――ES6などとも呼ばれたりするが――から、letでも宣言できるようになった」
「どう使いわけるの?」
「letで宣言すると、その変数のスコープをブロックの内部に限定することができる。ブロックとは、{ }で囲まれた範囲のことだな。具体例を見てみようか」

for (let i = 0; i < 10; i++) {
    console.log(i)
}
console.log(i)

「おお、こないだのforループだね」
「これを実行すると、0から9まで出力された後、最後にi is not definedとエラーが表示される。iがブロックの中でしか参照できないからだ」
「へえー」
「このように、ループ内でしか使わない変数だということを明確にできる、というメリットがある」
「なるほどねー」

「ではついでに、同じくECMAScript 2015から使えるようになったconstについても説明しようか」
「他にもあるんだ。宣言の仕方もいろいろだね」
「constは、変数ではなく、定数を宣言するための構文だ。定数の名のとおり、後から別の値を代入することはできない。つまり……」

const 絵子 = "fujoshi";

「と宣言したら二度と変更できないわけだ」
「もういいよ、それで」
「だが、しかし。悲観することはないぞ。定数は代入のやり直しができないというだけで、値が不変というわけではない」
「……?? どういうこと?」
「constで宣言した定数には、文字列や数値だけでなく、配列やオブジェクトも代入できる。例えば……」

const 絵子 = {"looks": "残念"};

「というように定義されていたとしても、」

絵子.looks = "そこそこ";

「というように変更することができる。繰り返すが、代入のやり直しができないだけで、値の変更ができないわけではないのだ。良かったな」
「何が良かったのかさっぱりわからないぞ」
「というわけで、何かを宣言する時は時と場所を選びましょう、という話でした」
「…………そういう話だったっけ?」