![見出し画像](https://assets.st-note.com/production/uploads/images/61425105/rectangle_large_type_2_21bce891b56bce8e64443207619de0c7.jpeg?width=1200)
ノンプロ研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
↓ファイル02
まず最初に、グローバルが処理されて、そのあと関数が処理という流れ。
演習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の位置を関数内にずらすと、エラーとなる。
演習1-02 デバッグ
ちょっとあんまり良く分かってない。関数function myFunction1_01の中の変数msgは、グローバルに書かれている var msg = 'Hello!'; だよってことか??
聞いてみた。
キャプチャで右に見えているのは、5行目までを実行した時点で、グローバル変数msgの中に「Hello!」が入っているということを表しています。
グローバルの領域は、myFunction1_01の処理が走る前にすべて実行されるので、
myFunction1_01を実行すると、関数スコープの中の処理が始まる前に変数msgの中には値がすでに入っているということですね◎
グローバルつおい。
うーん、こうするとわかりやすいかな。
ブロックスコープの中でvar入れておくと、デバッグしたときに、ローカル領域では msg: undefined になるわけですね、なるほど?わかってきたような気がします~
演習1-03 ブロックスコープ
↓ブロック(波括弧の中)でconstしていると、その宣言の有効範囲はそのスコープの中だけなので、14行目のコンソールログで出力はされない。
↓スコープを揃える(という言い方でいいのか?)と、workする。
演習1-04
グローバル領域で宣言しておくと、両方のfunctionの中からも呼び出せる。
演習1-05
let
これをデバッグしてみてみると、Scriptになってる。う~ん、このへんよくわかんないなー。
constconstは定数なので再代入できない、なのでエラーになる。
/** ☕ **/
スコープを閉じることのメリットは、変数・定数などの命名・管理が楽になる、管理のしやすさということのようだが、まだハラオチはしてないかなー。
グローバル領域は便利でもあるけど、実行するたびに参照されるので使いどことに注意が必要。
だんだん、実感を伴って分かってくるはず!
続く。
いいなと思ったら応援しよう!
![good-sun(a03)](https://assets.st-note.com/production/uploads/images/74915135/profile_e6435615735e2ec66a673a40d90bb4a5.png?width=600&crop=1:1,smart)