繁体   English   中英

JavaScript回调函数的作用域?

[英]Javascript callback function scope?

我有一个JavaScript函数,该函数具有一个回调,然后是一个匿名函数,然后是另一个回调,并且作用域出了点问题。 参数callbackFunc从第一个函数调用中保留其值,而不使用第二个函数调用中传递的新值。

function IsReady(callbackFunc) {   
    if (!IsValid()) return false;
    IsConnected(function () {
        if (typeof (callbackFunc) == 'function')
            callbackFunc();
        return true;
    });    
}

function IsConnected(validCallbackFunc) {
$.post("IsConnected", function (data) {
    if (data.IsValid) {
        if (validCallbackFunc && typeof (validCallbackFunc) == 'function')
            validCallbackFunc();
    }
});
}

$('#SaveButton').click(function () {
    IsReady(SaveInvoice); // works       
});

$('#ExportButton').click(function () {
    // works only if IsConnected() is true     
    // otherwise SaveInvoice is called again
    IsReady(ExportInvoice);  
});

function SaveInvoice() {}
function ExportInvoice() {}

在某些情况下,当我单击ExportButton时,将运行SaveInvoice函数而不是ExportInvoice函数。 我猜这是一个范围问题-某种程度上保留了callbackFunc的旧值。 但是由于回调+匿名函数+另一个回调的组合,我不太了解。 我没有编写此代码,但是我必须对其进行修复。 我有什么办法可以清除IsReady()末尾的callbackFunc的值?

如果IsConnected()为true,则IsReady(ExportInvoice)有效。 如果IsConnected()为false,则结果是将执行SaveInvoice(),而实际上不应该执行任何操作(因为未连接)。

无法在IsReady函数的两个不同调用之间保留callbackFunc值。

在您的代码中,每次执行click事件处理程序时,在调用IsReady时都会创建一个新的作用域。 每个作用域都有自己的局部参数callbackFunc 每个作用域将定义传递给IsConnected自己的匿名函数,该函数驻留在封闭在其中的callbackFunc变量中。

因此,这不是范围问题。

为了证明这一点,我在这里模拟了您的代码: http : //jsfiddle.net/pwJC7/

在您的代码中,您讨论了IsConnected返回值。 该函数实际上不返回任何内容。 连接状态似乎是通过ajax调用来检查的,该调用返回具有IsValid属性的XML或JSON数据(在小提琴中由$_post模拟)。

也许您的问题是由于此异步调用引起的。 但是,由于使用提供的JavaScript代码单击ExportInvoice按钮,您不可能体验到对SaveInvoice函数的调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM