在闭包中保存价值

Save value inside closure

我有一个对象 属性 onProgress。 属性 是一个接收秒数作为参数的函数,每当我的播放器更改它的持续时间时都会调用它。我想要做的是,在这个函数中,创建一个名为 oldSeconds 的 属性。我想要 console.log oldSeconds 变量和 currentSeconds。在这种情况下,oldSeconds 将始终比当前秒数少 1 秒。

问题在于 oldSeconds 始终为 0,因为该函数在每次调用时都会更新其值。无需在函数外部创建 oldSeconds 变量即可实现此目的?

对象:

var opts = {
  onProgress: function(seconds) {
    var oldSeconds = 0
    return function() {
      console.log('Seconds:', seconds, 'OldSeconds:', oldSeconds)
      oldSeconds = seconds
    }
  }
}

函数调用如下:

onProgress(1) // here oldSeconds should be 0
onProgress(2) // and here oldSeconds should be 1

编辑:

我成功了。所以函数应该这样重写:

var opts = {
  onProgress: function() {
    var oldSeconds = 0
    return function(seconds) {
      console.log('seconds:', seconds,'oldSeconds:', oldSeconds)
      oldSeconds = seconds
    }
  }
}

var progress = opts.onProgress()
progress(1)
progress(2)

等等。

问题是我不想做

var progress = onProgress()

因为 onProgress 函数并不总是像那个函数那样的函数(它可以是通用函数)。

那么 'detect' 函数 returns 怎么关闭并做我想做的事情呢?

您的代码很接近,但参数在错误的位置并且您缺少包装器的函数调用:

var opts = {
 onProgress: function() {
  var oldSeconds = 0
  return function(seconds) {
   console.log('Seconds:', seconds, 'OldSeconds:', oldSeconds)
   oldSeconds = seconds
  };
 }() // <-- call the wrapper function
}

现在 "onProgress" 属性 将使用 调用 该匿名函数的结果进行初始化。该结果将是稍后作为 obj.onProgress() 调用的实际函数,因此这就是 "seconds" 参数需要的地方。