【GAS】 var・let・constの違いと使い分け
Google Apps Script(GAS)の構文では、変数・定数の宣言をする際に<var・let・const>の3つの宣言文が使われています。各宣言文の違いと、利用が推奨される場面について整理しました。
宣言文とは?
他の言語と同様に、GASでも変数や定数は宣言前に宣言文(「var」「let」「const」)を置きます。使い方としては共通で[宣言文] [変数名/定数名]=[値]と記載すればOKです。
function myFunction() {
var a = 10;
Logger.log(a); //10.0
let b = 10;
Logger.log(b); //10.0
const c = 10;
Logger.log(c); //10.0
}
記載方法が共通かつ一見アウトプットも同じなので、どの場面でどの宣言文を使うか迷います。では各宣言文は何が違うのでしょうか?
「var」「let」「const」の違い
スクリプトを実行するうえで発生する数値・文字列・オブジェクトなどのデータを格納するためのデータの箱です。特徴の違いは下記の表のとおりです。
変数or定数 | 再代入 | 再宣言 | スコープ | |
---|---|---|---|---|
var | 変数 | 可能 | 可能 | 関数 |
let | 変数 | 可能 | 不可能 | ブロック |
const | 定数 | 不可能 | 不可能 | ブロック |
変数は「var」「let」、 定数は「const」
変数の宣言には「var」「let」、 定数の宣言には「const」を使います。 まずは定数と変数の違いを抑えましょう。
- 変数:値を何度も代入しなおせる(var・let)
- 定数:値を一度決めたら代入し直すことができない(const)
実際に代入しようとして確認します。
function myFunction() {
var a = 10;
a = 5; // OK
let b = 10;
b = 5; // OK
const c = 10;
c = 5; // エラー
}
constでは再代入ができないことが確認できました。
「var」と「let」の違い
「var」と「let」は同じ「変数の宣言文」ですが、再宣言できるかどうか、グローバルで参照できるかの違いがあります。
function myFunction() {
var a = 10;
a = 5; // OK
let b = 10;
b = 5; // OK
const c = 10;
c = 5; // エラー
}
2回同じ変数名で宣言しようとすると、「let」のほうだけ『既に宣言されています』というエラーが発生しました。次に参照範囲を見てみましょう。
//varの場合
function myFunction() {
var a = 100;
if(true){
var b = 10;
}
Logger.log(a); // 100
Logger.log(b); // 10
}
//letの場合
function myFunction() {
let a = 100;
if(true){
let b = 10;
}
Logger.log(a); // 100
// Logger.log(b); // エラー
}
varは関数スコープ(関数内で参照可能)・letはブロックスコープ(ブロック内で参照可能)なので、if文内で宣言すると「let」だけ実行エラーになりました。
現在は「var」ではなく「let」が推奨
実は定数宣言文の「const」と「let」は最近できた宣言文で、かつては「var」のみが使用可能でした。GASで「V8ランタイム」というJavaScript実行エンジンがサポートされタイミングで「const」「let」が使用できるようになってます。
この以前から使えた「var」と追加された「let」「const」との違いは、関数内で参照できる「let」に対して、「let」「const」のブロックで囲われた範囲でのみしか参照できないということです。一見、「var」の方が使い勝手がよさそうですが、関数を超えて再宣言できてしまうというミスを誘発しやすいことから、現在では、変数宣言では「let」が推奨されています。
まとめ
Google Apps Script(GAS)の構文で使われる変数・定数の宣言文<var・let・const>について解説を行いました。
- 変数の宣言には<var・let>、定数の宣言には<const>が使える
- 定数である<const>には再代入ができない
- 変数の宣言文のうち<var>は関数外からでも参照できるが、<let>は関数外からでは参照ができない
- 現在は<var>ではなく<let>が推奨されている