javascript闭包函数的用法

usage of javascript closure function

本文关键字:用法 函数 闭包 javascript      更新时间:2023-09-26

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

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

我不确定如何将parms传递给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/

将带有参数的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);

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

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