在封闭内保存价值

时间:2015-07-23 18:02:55

标签: javascript closures

我有一个属性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函数并不总是像那个函数那样(它可以是泛型函数)。

那么怎么'检测'函数返回一个闭包并做我想做的事?

1 个答案:

答案 0 :(得分:1)

您的代码已关闭,但参数位于错误的位置,并且您错过了包装器的函数调用:

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

现在&#34; onProgress&#34;属性将使用调用该匿名函数的结果进行初始化。该结果将是稍后作为obj.onProgress()调用的实际函数,以便&#34;秒&#34;参数必须是。