2017-07-10 3 views
0

Google Scriptsでスクリプトコードを高速化するためにクロージャを使用しようとしています。概念は私には新しかったが、クロージャが以下のコードで正しく適用されるかどうかは疑問だ。 (コードが動作する)この閉鎖は正しいですか、私の推論に間違いがありますか?

背景:このコードは、1か月にどれだけ割合が進んでいるかを計算することです。

関数が呼び出されるたびにnow変数とmonth変数が更新されることは望ましくありませんが、ドキュメントが開かれている場合は一度だけ更新されます。私が本質的に望むのは、すべての変数が一度しか設定されておらず、関数が複数回呼び出された場合にその関数が答えを返すということです。

これはクロージャを使用する正当な理由ですか、正しく使用していますか?

アドバイスと忍耐ありがとうございます。

// calculate progress with second precision 
var progressCalc = (function() { 

    const stMonth = SpreadsheetApp.getActive() 
    .getRangeByName("pStartdate") 
    .getValue(); 

    const eoMonth = SpreadsheetApp.getActive() 
    .getRangeByName("pEndOfMonthDate") 
    .getValue(); 

    const now = new Date(); 

    var unixProgressEoMonth = unixTime(eoMonth)-unixTime(stMonth) 
    var unixProgressNow = unixTime(now)-unixTime(stMonth) 

    return function() { return unixProgressNow/unixProgressEoMonth;}; 

})(); 

function progress() { 
    Logger.log(progressCalc()); 
    return progressCalc(); 
} 
+0

"*私はスクリプトコードのスピードを上げるためにクロージャーで作業しようとしています*" - そうですか?返された関数(クロージャ)は常に同じ値を返すので、複数回実行したり、除算を繰り返す必要はありません。結果値自体をグローバルな 'progressVal'変数に格納するだけで、' progressCalc'の必要はありません。 – Bergi

+0

私はあなたが何を意味するのか分かりません。おそらく私はそれを見ることができるように簡単な例を作ることができますか? – Christoph

+0

「進捗状況」や「progressCalc」がどこで呼び出されたか、そしてクロージャのないオリジナルのコードがどのように見えるかをわかりやすく伝えることができれば、より良い答えを出すことができます。正しく – Bergi

答えて

1

私はGoogleのスクリプトで私のスクリプトコードをスピードアップするために、クロージャと協力しようとしています。

次に、progressCalcが呼び出されるたびに計算を評価しないでください。

これはクロージャを使用するのに適していますか?

いいえ実際には、計算結果が一定であるため、関数に入れて何度も実行する必要はありません。ファンクションを保存する代わりに、すぐに結果値を保存してください。

var progressValue = (function() { 

    const stMonth = SpreadsheetApp.getActive() 
    .getRangeByName("pStartdate") 
    .getValue(); 

    const eoMonth = SpreadsheetApp.getActive() 
    .getRangeByName("pEndOfMonthDate") 
    .getValue(); 

    const now = new Date(); 

    var unixProgressEoMonth = unixTime(eoMonth)-unixTime(stMonth) 
    var unixProgressNow = unixTime(now)-unixTime(stMonth) 

    return unixProgressNow/unixProgressEoMonth; 
})(); 

function progress() { 
    Logger.log(progressValue); 
} 
+0

最後の質問です。私が正しく理解すれば、()がその機能を実行します。したがって、変数progressValueを作成します。名前のない(?)関数を挿入し、その中に()を置くことによって変数内で実行します。次に、後ろに()を置かなければ、評価なしでどこでもprogressValueを使うことができます。 – Christoph

+0

@Christoph [このパターン](https://stackoverflow.com/questions/26092101/what-is-this-javascript-pattern-called-and-why-is-it-used)はIIFEと呼ばれます。いいえ、無名関数はどこにも挿入されず、作成、実行、および忘れられたばかりです。変数についても知らない。変数に代入されるのは、呼び出しの*戻り値*(このケースの数値)です。なぜなら、この関数を使用するときには、その背後に()を置かないのが理由です。 – Bergi

+0

お世話になりました!これは多くを明確にします。 – Christoph

関連する問題