見出し画像

ノンプロ研GAS中級講座 第1回 スコープと関数 その1

当日のTogetter

本研修のゴール

GASの開発・保守を楽に&スマートにできる知識とスキルを身につける

初級講座を受けて、ツールを作れるようになったはいいものの、次の課題としてコードの可読性やら再現性やらメンテナンス性やら、ううむという場面が増えてきた。中級講座でヒントを得たい。

研修日程

09/21火 スコープと関数 ←いまここ
10/05火 クラス・ライブラリ
10/19火 組み込みオブジェクト
11/02火 Script Services 1
11/16火 Script Services 2
11/30火 HTTP通信・API
12/14火 卒業LT大会

スコープ

スコープとは、変数・定数や関数などを使用できる範囲のこと。

変数や定数には、どこからそれを参照できるのか、その範囲が定まってるそーです。
呪文の有効範囲みたいなものですね。
初級のときは、varを使うと事故の元なので、基本はconstで定数として定めておいて、for文回すときなどは変数letを置く、というざっくり理解で進んでいました。中級ではもうちょっとこのへんを突っ込んでいくようです。

スコープの種類
・グローバルスコープ:プロジェクト全体から参照できる。全体魔法。
・ローカルスコープ:特定の範囲のみから参照できる。
 -関数スコープ:宣言された関数の内部からのみ参照できる。
 -ブロックスコープ:宣言されたブロックの内部からのみ参照できる。{}に囲まれたブロック内のこと。
グローバル領域とローカル領域
ローカル領域 いずれかの関数内の領域
グローバル領域 いずれかの関数に含まれない領域

演習1-01

説明とか文字だけ読んでてもピンとこないので、コード書いて動きを見てみよう。

ファイルを二つ用意して、それぞれにコード書いて、実行してみます。


↓ファイル01

画像1


↓ファイル02

画像2


まず最初に、グローバルが処理されて、そのあと関数が処理という流れ。


演習1-01 コードとその解釈(私の解釈)

// スクリプトファイル01.gs
var msg = 'Hello!';
function myFunction1_01() {
 console.log(`ローカルで${msg}`);
}

console.log(`グローバルで${msg}`);
// スクリプトファイル02.gs

console.log(`他のスクリプトファイルで${msg}`);

var msg = 'Hello!'; これが、グローバル領域に書かれている。
で、

console.log(`ローカルで${msg}`);はブロックスコープの中に書かれていて、なのでドキュメントフォーマットすると字下げされている。ここはローカル領域。

console.log(`グローバルで${msg}`); は関数外に書かれている。ここはグローバル領域になる。

console.log(`他のスクリプトファイルで${msg}`); は02のファイルに書かれているが、グローバルに宣言された var msg = 'Hello!'; を参照して出力している。

varの位置を関数内にずらすと、エラーとなる。

画像4

演習1-02 デバッグ

画像3

ちょっとあんまり良く分かってない。関数function myFunction1_01の中の変数msgは、グローバルに書かれている var msg = 'Hello!'; だよってことか??

聞いてみた。

キャプチャで右に見えているのは、5行目までを実行した時点で、グローバル変数msgの中に「Hello!」が入っているということを表しています。

グローバルの領域は、myFunction1_01の処理が走る前にすべて実行されるので、
myFunction1_01を実行すると、関数スコープの中の処理が始まる前に変数msgの中には値がすでに入っているということですね◎

グローバルつおい。


うーん、こうするとわかりやすいかな。

画像7


画像8

ブロックスコープの中でvar入れておくと、デバッグしたときに、ローカル領域では msg: undefined になるわけですね、なるほど?わかってきたような気がします~

演習1-03 ブロックスコープ

↓ブロック(波括弧の中)でconstしていると、その宣言の有効範囲はそのスコープの中だけなので、14行目のコンソールログで出力はされない。

画像5

↓スコープを揃える(という言い方でいいのか?)と、workする。

画像6


演習1-04

画像9


グローバル領域で宣言しておくと、両方のfunctionの中からも呼び出せる。

画像10

演習1-05

let

画像11

これをデバッグしてみてみると、Scriptになってる。う~ん、このへんよくわかんないなー。

画像13


constconstは定数なので再代入できない、なのでエラーになる。

画像12

/** ☕ **/

スコープを閉じることのメリットは、変数・定数などの命名・管理が楽になる、管理のしやすさということのようだが、まだハラオチはしてないかなー。

グローバル領域は便利でもあるけど、実行するたびに参照されるので使いどことに注意が必要。


だんだん、実感を伴って分かってくるはず!

続く。

いただいたサポートで、書籍代や勉強費用にしたり、美味しいもの食べたりします!