我知道这个问题已被多次询问(是的,我做了一些研究)但我找不到符合我需要的解决方案。
到目前为止我做了什么:
我正在构建一个函数,用于跟踪用户向下滚动页面的百分比,并将其很好地显示在某个进度条中。这非常有效,但当我在Chrome上打开开发人员控制台并查看时间轴选项卡(这显示了正在运行的图形中)时,我意识到我的代码非常“活跃”。它运行了用户在页面上向下滚动的每个像素,这很不诚实。
所以我想,如何改进,我想出了一个解决方案,涉及每{毫米}毫秒执行一次函数。如果函数已经在{whatever}毫秒内执行,则涉及将变量设置为true或false。
我想要完成的事情:
我希望能够设置一个外部变量的引用,该外部变量将作为一个标志来确定该函数是否已被执行。
function qeue(fn, interval, status){ // this function name might not be very fitting..
// fn = function to be executed
// interval = function can only run once between the intervals
// status = tricky part..
// This should contain a reference to an external variable that is either true or false
}
如何实现这一目标?
旁注
如果这个解释没有帮助,你仍然没有得到我想要的东西:
如何将对变量的引用传递给函数,以便该函数可以根据该变量的值进行操作?
为什么普通参数不是选项 我想在函数内部实现某种递归的setTimeout功能,检查是否已经执行了另一个函数,如果我将其传递给参数,则该参数在此过程中不能更改。
希望你们能帮助我!
谢谢
感谢您的所有好评。你让我学到了很多东西。我正在进行去抖策略!我标记了T.J.克劳德作为最佳答案,因为这是一个很好的解释和第一个。但是再次感谢大家!
答案 0 :(得分:2)
您所描述的想要做的事情并没有立即说出"使用对变量的引用"对我来说(正如Teemu指出的那样,听起来像你想要debouncing),但回答你关于变量引用的问题......
JavaScript没有任何形式的变量引用(除了通过闭包,这可能会有问题)。但是你可以通过使用一个对象并在其上使用一个属性来随时做你正在谈论的事情。该属性是"变量。"
简单示例:
function foo(obj) {
var counter = 0;
var timer = setInterval(function() {
console.log("foo: " + obj.property);
if (++counter === 5) {
clearInterval(timer);
}
}, 500);
}
var o = {property: "unchanged"};
// Give the "reference" to `property` to `foo`:
foo(o);
// Update it periodically while `foo` is doing its asynchronous thing
setTimeout(function() {
o.property = "update 1";
}, 1000);
setTimeout(function() {
o.property = "update 2";
}, 1700);

答案 1 :(得分:2)
在整数,字符串等JavaScript值中按值传递。如果要传递引用,则必须将对象传递给JavaScript函数。 (JavaScript对象通过引用传递)
function adjustValues(referenceObject) {
referenceObject.foo = 2;
referenceObject.bar = "newValue";
}
referenceObject = {
foo: 1,
bar: "initialValue"
};
adjustValues(referenceObject);
答案 2 :(得分:0)
为什么不使用setInterval函数,它会完全按照您的意愿执行。
示例:
setInterval(function() {
// logic to be implemented
}, delayInMilliseconds)
答案 3 :(得分:0)
如何实现这一目标?
没有变量。 JS中没有“变量引用”。我可以看到两个简单的解决方案:
传递getter / setter函数:
function queue(getStatus) {
…
getStatus() // gets current value
…
}
var executed = false;
queue(function() { return executed; });
传递一个具有属性的对象:
function queue(status) {
…
status.executed // gets current value
…
}
var status = {executed: false};
queue(status);
我提出了一个解决方案,涉及每{毫米}毫秒执行一次函数。如果函数已经在{whatever}毫秒内执行,则涉及将变量设置为true或false。
我看不出为什么这个变量需要作为函数的参数,并且在它之外可用(甚至可设置?)的原因。只需在queue
内使用局部变量。
顺便说一下,这个功能被称为 debouncing ,你不必自己写这个。许多实现已经在Web上可用,有时作为大型库的一部分。请参阅示例What does _.debounce do?。
答案 4 :(得分:0)
尝试以下示例:
'use strict';
var observable = 0;
function incObservable() {
++observable;
console.log('incObservable observable: '+observable);
}
function observe() {
console.log('observe observable: '+observable);
}
var observer = setInterval(observe, 100);
setTimeout(function() {
incObservable();
setTimeout(function() {
incObservable();
setTimeout(function() {
incObservable();
}, 300);
}, 300);
}, 300);
setTimeout(function() {
// Stop obsever
clearInterval(observer);
}, 1000);
// observe observable: 0
// observe observable: 0
// incObservable observable: 1
// observe observable: 1
// observe observable: 1
// observe observable: 1
// incObservable observable: 2
// observe observable: 2
// observe observable: 2
// observe observable: 2
// incObservable observable: 3
// observe observable: 3