2011-04-02 139 views
0

我有一个JavaScript函数,它有一个回调,然后是一个匿名函数,然后是另一个回调,并且范围出了问题。参数callbackFunc保留其第一个函数调用的值,而不使用第二个函数调用中传递的新值。Javascript回调函数范围?

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的值?

IsReady(ExportInvoice)在IsConnected()为true时有效。如果IsConnected()为false,那么结果就是SaveInvoice()在实际上什么都不应该发生时执行(因为它没有连接)。

+1

我想你应该也发布相关的HTML。 – Pointy 2011-04-02 22:59:56

+1

你的javascript看起来很好。尽管你对返回真/假的理解不起作用。返回语句不像您期望的那样级联,没有处理返回值。 – Raynos 2011-04-02 23:08:26

+0

不是我的代码哈哈。是的,回报什么都不做。但是这并不能解释为什么当点击ExportButton时调用SaveInvoice。我已经删除了不必要的回报。 – 2011-04-02 23:25:03

回答

1

在两个不同的函数调用IsReady函数之间,没有办法可以保留callbackFunc值。

在您的代码中,每次执行点击事件处理程序时,当调用IsReady时,将创建一个新的作用域。每个范围都有自己的本地参数callbackFunc。每个范围将定义自己的匿名函数传递给IsConnected,其中封闭在闭包中的callbackFunc变量。

所以这不是一个范围问题。

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

在你的代码谈谈IsConnected返回值。这个函数实际上不会返回任何东西。连接状态似乎通过ajax调用来检查,返回的XML或JSON数据为IsValid属性(在小提琴中由$_post模拟)。

也许你的问题是由于这种异步调用。但是,由于您使用您提供的JavaScript代码点击ExportInvoice按钮,您不可能遇到致电SaveInvoice函数。