Javascript 这个结论正确吗?我的推理有错误吗

Javascript 这个结论正确吗?我的推理有错误吗,javascript,google-sheets,closures,Javascript,Google Sheets,Closures,我正在尝试使用闭包来加速我在Google脚本中的脚本代码。这个概念对我来说是新的,但我想知道在下面的代码中是否正确地应用了闭包。代码是有效的 背景:代码用于计算一个月的进度百分比 我不希望now和month变量在每次调用函数时都更新,但在打开文档时只更新一次。我本质上想要的是,所有变量只设置一次,如果函数被多次调用,它将提供一个答案 这是使用闭包的好理由吗?我是否正确地使用了闭包 谢谢你的建议和耐心 // calculate progress with second precision var

我正在尝试使用闭包来加速我在Google脚本中的脚本代码。这个概念对我来说是新的,但我想知道在下面的代码中是否正确地应用了闭包。代码是有效的

背景:代码用于计算一个月的进度百分比

我不希望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();
}
我正在尝试使用闭包来加速我在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);
}

我正在尝试使用闭包来加速我的脚本代码-嗯?请注意,返回的函数闭包将始终返回相同的值,因此多次执行闭包或重复除法没有意义。您也可以将结果值本身存储在一个全局progressVal变量中,不需要progressCalc。我不确定我是否理解您的意思。你能举个简单的例子让我看一下吗?如果你能告诉/告诉我们progress或progressCalc的调用频率,我们可以给出更好的答案,以及没有闭包的原始代码是什么样子的,这样我们就可以判断加速率,以及您是否正确应用了模式。我喜欢这样使用它,因为它比每次在我写值之前都要定义范围更容易操作。想想看,我可以写一次,然后在我的电子表格中引用它。这将解决速度问题。好的,最后一个问题:如果我理解正确,将执行函数。因此,创建变量progressValue。插入无名函数,将其放在变量中执行。接下来,如果我不把progressValue放在后面,我可以在任何地方使用它,而不用对它进行评估。@Christoph被称为IIFE。不,无名函数没有插入到任何地方,它只是被创建、执行和遗忘。它甚至不知道这个变量。分配给变量的是调用的返回值-在我们的例子中是一个数字-这就是为什么我们在使用它时不把它放在后面。谢谢你的帮助!这澄清了很多。