我有一个属性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
函数并不总是像那个函数那样(它可以是泛型函数)。
那么怎么'检测'函数返回一个闭包并做我想做的事?
答案 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;参数必须是。