スコープについて
Googleスプレッドシートの操作を中心にGAS(GoogleAppsScript)の基本コードを紹介しています。初心者の方が順番に読んでくだけでGASの基礎コードが理解出来るようになればなと思って、短めの記事で進めて行きたいと思います!
今回は、”スコープについて”について紹介します!
スコープ
「スコープ」って言っても馴染みのない言葉ですね。でもプログラミングする上では、意識しておかないといけないことなので説明します!
これまで変数について色々とやってきました。実は変数には、その変数を参照できる範囲が決まっています。この決まってる範囲が”スコープ”という名前で呼ばれています。
グローバル領域
次のサンプルを見てください。
var name = "ひらちん"
Logger.log(name)
function test(){
// なにもしない
}
どの関数にも属さない場所に、変数nameとログ書き出しのステートメントを書いています。その後に関数testを中身はなにも無い状態で記述しています。
この関数testを実行するとどうなるでしょう?
答えは、ログに”ひらちん”が表示されます。
このようにGASでは、gsファイルの中の、どの関数にも属さない場所にステートメントを記述することが出来ます。この領域をグローバル領域と言い、どの関数を実行しても、必ず実行されます。
なんかしらの関数が実行されると、まずはグローバル領域のステートメントが実行されるわけです。
実行順を、確認するために次のサンプルを実行してみましょう。
var name = "ひらちん"
Browser.msgBox(name)
function test(){
Browser.msgBox("関数の中")
}
はじめに、「ひらちん」が表示されて、次に「関数の中」が表示されました。グローバル領域の方が先に実行されていることが分かります。
ちなみに、一つのプロジェクトの中に複数のgsファイルを作ることが出来ますが、どのgsファイルの関数が実行されても、全てgsファイルのグルーバル領域のステートメントは実行されます。
あまり、いろいろなファイルのグローバル領域にステートメントを書きすぎると、どこで何が実行されているのかわかりにくくなるので、やめたほうが良いですね(^^)
特に、必要がない場合は、グローバル領域には書かないのをオススメします。
プログラムの実行順序
プログラムは、基本的には上から順番に実行されます。
まずグローバル領域が実行されてから、呼び出した関数の中を上から実行されるという具合です。
ですので、次のような順序で書いた場合は関数じゃ無いぞ!のエラーになるので注意してください。
function test(){
Browser.msgBox("掛け算の答え:" + kakezan(5,2))
var kakezan = function(a, b){
return a* b;
}
}
関数の定義は、以前にやった関数リテラルを変数に代入する形です(覚えてますか?)このコードの場合、上から実行されるわけなので、関数を定義するよりも先に呼び出しをしてしまっていますので、そんな関数無いぞ!と起こられているという状況です。
次のように関数の定義を、グローバル領域に記述すると、ちゃんと実行されます。グローバル領域のが先に実行されるからですね。
function test(){
Browser.msgBox("掛け算の答え:" + kakezan(5,2))
}
//グローバル領域
var kakezan = function(a, b){
return a* b;
}
グローバルスコープ
それでは、スコープの話です。先程説明したグローバル領域で宣言された変数はグローバル変数と呼ばれ、プロジェクトのどこからでも参照できる状態になります。
サンプルを見てください。
//グローバル領域
var name = "ひらちん"
Browser.msgBox("グローバル領域:" + name)
//関数
function test(){
Browser.msgBox("関数の中:" + name)
}
グローバル領域で変数の宣言を行って、グローバル領域と、その後の関数の中で変数を利用しています。
どちらの変数もきちんと表示されました。このようにグローバル領域で宣言した変数は、どこからでも参照することが出来ます。
ローカルスコープ
関数の中で宣言された変数はローカル変数と呼ばれ、その関数の中でしか参照することが出来ません。
こちらもサンプルで試してみましょう。
//関数1
function test1(){
var name = "ひらちん"
Browser.msgBox("関数1:" + name)
}
//関数2
function test2(){
Browser.msgBox("関数2:" + name)
}
関数1と関数2を作成しました。関数1で変数nameを宣言しています。その変数を関数1と関数2で呼び出してみましょう。
関数1は普通ですね。変数宣言をした関数の中なのでメセージが表示されました。関数2を実行すると、ローカル変数は他の関数からは参照できないので、そんな変数無いぞ!と怒られましたね。
注意点
ここまで読むと、じゃあグローバル変数の方が便利じゃん??と思う方もいるかもしれません。確かに、小さなプログラムではその方が良い場合もあるかもしれません。しかし、沢山の関数・プログラムを書いて行くと、どこでどんな名前の変数を付けたのか分からなくなってしまいます。グローバル変数は、どこからでも参照、つまり書き換えも出来てしまうので、意図しない場所で違う意味で使っている変数を書き換えてしまう現象が起こってしまうかもしれません。重大なエラーを引き起こす可能性もありますので、できるだけ使わない方が良いと思います。
まとめ
スコープについて説明しました!スコープを意識して、適切なプログラムを書くことは重要ですので、しっかり覚えましょう!
コメント