【问题标题】:usage of javascript closure functionjavascript闭包函数的使用
【发布时间】:2011-12-25 00:25:49
【问题描述】:

我正在尝试弄清楚如何使用闭包函数。 在单击事件中,我想确定 parm1parm2 的值并将它们显示在 div 中, 然后使用 SQL 语句将新值更新到表中。

如果用户反复点击,我想节流(去抖动)并且只在用户停止点击后 5 秒执行 SQL 更新。但是,parm1parm2 应该在每次点击时显示。

我不确定如何将参数传递给 SQL 进程。

(function() {
  // create debounced function
  var d_process = $.debounce(SQLprocess, 5000);

  $('#myButton').click(function() {
    // determine parameters
    var parm1 = 1 + 1;                       // edit: added var
    $(".div_1").text(parm1);

    var parm2 = 2+2;                      // edit: added var
    $(".div_2").text(parm2);

    d_process();
  });
}());


function SQLprocess(parm1, parm2) {
  //perform an SQL update
}

参考: http://code.google.com/p/jquery-debounce/

【问题讨论】:

  • 你声明 parm1 和 parm2 的方式你可以直接在你的函数中使用它们,它们是全局范围的。实现“去抖动”的另一种方法是在按钮被点击后禁用 5 秒。
  • Chao -true 在第一点上。对于thr 秒,该按钮用于添加将闹钟调整1 分钟,因此用户应该可以单击多个时间。我只是不想在他完成点击之前更新数据库。

标签: javascript closures throttling


【解决方案1】:

要将带有参数的 SQLprocess 传递给 debounce 函数,请更改以下内容:

var d_process = $.debounce(SQLprocess, 5000);

到这里:

var d_process = $.debounce(function() {SQLprocess(parm1, parm2)}, 5000);

这会创建一个不带参数的匿名函数,并传递给 debounce。但该匿名函数使用正确的参数调用 SQLprocess。


有人问你为什么不能这样做:

var d_process = $.debounce(SQLprocess(parm1, parm2), 5000);

答案是,在 Javascript 语言中,SQLprocess(parm1, parm2) 是一个函数调用。它将立即执行该函数并将返回值传递给$.debounce(),这不是您想要的。 $.debounce 期待一个没有参数的函数,所以这就是你必须传递的。将参数传递给SQLprocess 的方法是将其包装在一个没有参数的函数中。它不必是匿名函数。如果您愿意,也可以使用命名函数:

function myFunctionWrapper() {
    SQLprocess(parm1, parm2);
}

var d_process = $.debounce(myFunctionWrapper, 5000);

【讨论】:

  • 就这么简单!?为什么我们不首先在 {SQLprocess()} 上加上括号?
  • @MustaphaGeorge:因为 JS 中的匿名函数语法是冗长的 function(){} 东西。这不是红宝石:P
  • @MustaphaGeorge - 我在答案中添加了解释为什么你不能只添加内联参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多