【问题标题】:Passing a pointer/reference to a variable as parameter将指针/引用作为参数传递给变量
【发布时间】:2017-01-01 15:10:36
【问题描述】:

我知道这个问题已被问过多次(是的,我做了一些研究),但我找不到适合我需求的解决方案。

到目前为止我做了什么:

我正在构建一个函数来跟踪用户向下滚动页面的百分比并将其很好地显示到某个进度条中。这非常有效,但是当我在 Chrome 上打开开发者控制台并查看 Timeline 选项卡(这以漂亮的图形显示正在运行的内容)时,我意识到我的代码非常“活跃”。它运行了用户向下滚动页面的每个像素,老实说,这相当多。

所以我心想,如何才能改进这一点,我想出了一个解决方案,该解决方案涉及每 {whatever} 毫秒只执行一次函数。如果函数已经在 {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.克劳德是最好的答案,因为它是一个很好的解释,也是第一个。但是再次感谢大家!

【问题讨论】:

标签: javascript


【解决方案1】:

您所描述的想要做的事并没有立即对我说“使用对变量的引用”(正如 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);

【讨论】:

  • 谢谢!这就是我要使用的。
【解决方案2】:

在 JavaScript 中,整数、字符串等值是按值传递的。如果要传递引用,则必须将对象传递给 JavaScript 函数。 (JavaScript 对象通过引用传递)

function adjustValues(referenceObject) {
    referenceObject.foo = 2;
    referenceObject.bar = "newValue";
}

referenceObject = {
  foo: 1,
  bar: "initialValue"
};

adjustValues(referenceObject);

【讨论】:

    【解决方案3】:

    为什么不使用 setInterval 函数,它会做你想做的事。

    例子:

    setInterval(function() { 
        // logic to be implemented
    }, delayInMilliseconds)
    

    【讨论】:

      【解决方案4】:

      如何做到这一点?

      不带变量。 JS 中没有“对变量的引用”。我可以看到两个简单的解决方案:

      1. 传递一个getter/setter函数:

        function queue(getStatus) {
            …
            getStatus() // gets current value
            …
        }
        
        var executed = false;
        queue(function() { return executed; });
        
      2. 传递一个带有属性的对象:

        function queue(status) {
             …
            status.executed // gets current value
            …
        }
        
        var status = {executed: false};
        queue(status);
        

      我想出了一个解决方案,它涉及每 {whatever} 毫秒只执行一次函数。如果函数已经在 {whatever} 毫秒内执行,则这涉及设置为 true 或 false 的变量。

      我看不出为什么这个变量需要作为函数的参数,并且在它之外可用(甚至可以设置?)。只需在 queue 中使用局部变量即可。

      顺便说一句,此功能称为去抖动,您不必自己编写。许多实现已经在网络上可用,有时作为较大库的一部分。参见例如What does _.debounce do?

      【讨论】:

        【解决方案5】:

        试试下面的例子:

        '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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-01-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-17
          • 2018-09-17
          • 1970-01-01
          相关资源
          最近更新 更多