関数の巻き上げで順序の問題は消えない、関数の外の値へ移るだけ

JavaScriptでは、関数を定義するより前の行でその関数を呼び出せます。だから呼び出し順を気にしなくてよい、と言われますが、これは半分だけ正しい言い方です。持ち上がるのは関数の定義であって、関数が使う値ではありません。順序の問題は消えたのではなく、関数の中から関数の外の値へ引っ越しただけです。この記事では、巻き上げ(ホイスティング)の仕組みと例外を確かめ、Google Apps Script(GAS)でその引っ越し先がどこになるのかを見ます。

関数宣言は、定義より前で呼び出せます

function で始まる関数宣言は、書いた位置にかかわらず、コードの実行前に使える状態になります。宣言がコードの先頭に持ち上げられるようなイメージから、この仕組みをホイスティングと呼びます。

function greet(name) {
  sayHello();
  console.log('こんにちは、' + name + 'さん');
}

function sayHello() {
  console.log('Hello!');
}

greet('太郎');

sayHello の定義は greet より後ろにありますが、実行すると Hello! に続いて、こんにちは、太郎さん、と表示されます。全体の流れを表す関数を先頭に書き、細かな処理を後ろにまとめる、という読みやすい並べ方ができるのは、この仕組みのおかげです。

持ち上がらないものが三つあります

先に呼べるか、呼べないか
  • 関数式:const myFunc = function() {} のように関数を変数に入れる書き方では、代入より前に myFunc() を呼ぶとエラーになる
  • var で宣言した変数:宣言だけが持ち上げられ、値の代入は持ち上げられない。代入より前に参照すると undefined になる
  • let と const で宣言した変数:宣言より前に参照すると、undefined ではなくエラーになる

別のファイルにある関数も、ブラウザでは読み込んだ順に従います。functions.js、main.js の順に読み込めば main.js から sayHello を呼べますが、逆の順なら、まだ存在しない関数を呼ぶことになりエラーになります。

こうして並べると、気にしなくてよいのは関数宣言の位置だけで、値と読み込みの順序は相変わらず効いていることが分かります。順番を気にしなくてよい、という言い方は、その一番便利な一行だけを切り取ったものです。切り取った言い方を信じた人ほど、値が undefined になったときに、関数の並びを入れ替えて直そうとして時間を失います。原因は関数の並びではなく、値が用意される順番のほうにあるからです。

GASでは、関数の外の処理が毎回動きます

GASでも、関数宣言の考え方は同じです。プロジェクト内の複数のファイルに書いた関数宣言は、どのファイルからでも呼び出せます。GPTsのアクションからのリクエストを受け取る doPost を一つのファイルに置き、データの整形や書き込みの関数を別のファイルにまとめても動きます。

引っ越した順序の問題が顔を出すのは、関数の外に書いた処理です。2024年時点のGASでは、doPost のような関数が呼ばれるたびに、その前にプロジェクト内のすべてのファイルの関数の外の処理が、ファイルの並び順に実行されます。設定値の読み込みやスプレッドシートを開く処理を関数の外に書くと、リクエストが来るたびに毎回それが動き、しかもファイルの並びによっては、まだ値の入っていない変数を別のファイルが参照することになります。

関数の外に書いたほうが一度で済んで効率的だ、という直感は、ここでは逆を向きます。一度で済むのは、プログラムが一度だけ起動して動き続ける環境の話で、呼ばれるたびに最初から動き直すGASには当てはまりません。設定の読み込みは関数の中にまとめ、doPost から順に呼び出す形にしておくと、何がいつ動くのかを追えます。

ただ、どの書き方がいちばん速いかは、処理の重さや呼ばれる頻度で変わり、一概には言えません。実行時間を測ってみるまで、直感で決めないほうがよい部分です。

あなたのGASのプロジェクトで、関数の外に書かれている処理はいくつあるでしょうか。それは、リクエストのたびに動いてかまわない処理でしょうか。

この記事の背景にある考え方は、拙著『ChatGPT 誰でも1時間でできる! はじめてのGPTsのつくり方』の1章5節「GPT利用の前提条件と技術的限界」に書きました。道具には利用回数や実行時間などの決まった制約があり、それを知ったうえで計画的に作る、という話です。そこには「GPTsの開発には、様々な利用制限と技術的制約が伴います。」とあります。挙げた数字は2024年時点のものですが、この節を読むと、直感で書き方を選ぶ前に、動かす土台がどんな決まりで動いているのかを確かめる順番で考えられるようになります。

自分の仕事に効くAIは、誰が作るべきか。

ChatGPT 誰でも1時間でできる! はじめてのGPTsのつくり方 表紙

『ChatGPT 誰でも1時間でできる! はじめてのGPTsのつくり方』

要件を日本語で書き出せば、それがそのままAIを動かす。現場の知識を持つ人が自分で作り、育てる、内製化のための本です。

読み終えたとき、手元に残るもの

  • 目的、役割、入力、出力をそろえる要件定義の型
  • 評価基準と判断基準を持たせる考えるGPTの作り方
  • テスト用のダミーデータで直していく手順
  • 複数のGPTを分業と協業でつなぐ設計

画面や機能の記述は2024年時点のものです。仕事を分解し、基準を言葉にする考え方は今も変わりません。

Amazonで見る

著者プロフィール・お問い合わせ