Javascript调用函数,在函数返回之前不要再次调用它

Javascript调用函数,在函数返回之前不要再次调用它,javascript,closures,Javascript,Closures,我有一个按钮,当点击时调用一个函数——这个函数执行一些异步Ajax,并在Ajax返回时向messagebox发出警报。我不希望用户多次单击该按钮-如果他在Ajax未返回时单击该按钮,则应发出错误消息警报 我知道使用全局布尔变量可以很容易地做到这一点(初始设置为true,进行ajax调用并将其设置为false-当ajax返回时再次将其设置为true-当用户单击按钮时检查全局是否为false)。同样,如果我使用另一个包含函数和布尔值的全局对象来代替窗口/全局对象,也可以这样做 然而,我不太喜欢上面的

我有一个按钮,当点击时调用一个函数——这个函数执行一些异步Ajax,并在Ajax返回时向messagebox发出警报。我不希望用户多次单击该按钮-如果他在Ajax未返回时单击该按钮,则应发出错误消息警报

我知道使用全局布尔变量可以很容易地做到这一点(初始设置为true,进行ajax调用并将其设置为false-当ajax返回时再次将其设置为true-当用户单击按钮时检查全局是否为false)。同样,如果我使用另一个包含函数和布尔值的全局对象来代替窗口/全局对象,也可以这样做


然而,我不太喜欢上面的方法——我认为它们有点老派Javascript。我想知道是否有一种更优雅的方法可以做到这一点,例如使用JS闭包

使用此方法,变量将不会泄漏到全局范围。无法从函数外部操纵此变量:

var foo = (function(){
    var pending = false;
    return function foo(){
        if(pending) return;
        pending = true;

        //...Code

        //When finished:
        pending = false;
    }
})()

其他人可能建议设置函数的属性,但此属性可以从外部轻松调整,这是不可取的。

使用此方法,您的变量不会泄漏到全局范围。无法从函数外部操纵此变量:

var foo = (function(){
    var pending = false;
    return function foo(){
        if(pending) return;
        pending = true;

        //...Code

        //When finished:
        pending = false;
    }
})()
var callback = (function()
{
    var executing = false;
    function yourfunc()
    {
        if(executing) return; // exit if pending
        executing = true;

        // here send the request

        // edit: when the ajax response has returned
        xxxx.onreadystatechange....{
            // do what you need to do with ajax data
            executing = false;
        };
    }
    return yourfunc;
})();

callback();

其他人可能建议设置函数的属性,但此属性可以从外部轻松调整,这是不可取的。

匿名函数的形式如下

var callback = (function()
{
    var executing = false;
    function yourfunc()
    {
        if(executing) return; // exit if pending
        executing = true;

        // here send the request

        // edit: when the ajax response has returned
        xxxx.onreadystatechange....{
            // do what you need to do with ajax data
            executing = false;
        };
    }
    return yourfunc;
})();

callback();
(function(){}))()
最后一个()提供匿名函数的参数

在上面的示例脚本中(由wes编写)返回错误,因为回调函数不是已定义的函数。Rob使用闭包的方法听起来不错


干杯。。Sree

匿名函数的形式为

(function(){}))()
最后一个()提供匿名函数的参数

在上面的示例脚本中(由wes编写)返回错误,因为回调函数不是已定义的函数。Rob使用闭包的方法听起来不错


干杯。。Sree

为什么不在单击时禁用按钮?当响应返回时,启用它。同意-这是另一种方式,但我更喜欢更优雅的方式:)为什么不干脆禁用按钮并告诉用户它正在处理请求?这样,用户将知道后台正在发生某些事情,而您不需要全局变量或闭包。为什么首先要强迫用户再次单击按钮。记住-始终向用户提供反馈。干杯。哇,我不是唯一一个这么想的人。我讨厌移动网络。没有更新=(为什么不在单击时禁用按钮?当响应返回时,重新启用它。同意-这是另一种方式,但我更喜欢更优雅的方式:)为什么不干脆禁用按钮并告诉用户它正在处理请求?这样,用户将知道后台正在发生某些事情,而您不需要全局变量或闭包。为什么首先要强迫用户再次单击按钮。记住-始终向用户提供反馈。干杯。哇,我不是唯一一个这么想的人。我讨厌移动网络。没有更新=(函数foo()不应该被调用吗?我只定义了
function foo
。你可以随时调用
foo()
,但一次只能运行一个函数。我只为你草拟了一个工作概念,可以根据你的项目对其进行调整。因此有了虚拟名称(
foo
)。不应该是function foo()是否在某个地方调用?我只定义了
函数foo
。您可以随时调用
foo()
,但一次只能运行一个函数。我只为您草拟了一个工作概念,可以根据您的项目对其进行调整。因此使用了虚拟名称(
foo
)。不起作用,您没有将
yourfunc
分配给
callback
,而是将
yourfunc
分配给私有变量
cb
。不起作用,您没有将
yourfunc
分配给
callback
,而是将
yourfunc
分配给私有变量
cb