Javascript变量范围问题

Javascript变量范围问题,javascript,Javascript,如果我有这样一个函数: function validateSomething() { var valid; $.post("something.php", {x:y}, function(data) { if (isSomething(data)) valid=true; //Here referring to the valid variable //set outside this function, in the

如果我有这样一个函数:

function validateSomething()
{
  var valid;
  $.post("something.php", {x:y},
  function(data)
  {
     if (isSomething(data))
       valid=true; 
       //Here referring to the valid variable 
       //set outside this function, in the
       // parent function
     else
       valid=false; 
  });
  return valid/
}
是否可以在Ajax请求完成后调用的子函数中设置
有效
?如果不是,如何根据ajax请求的结果从父函数返回true/false

如果不是,如何根据ajax请求的结果从父函数返回true/false

你不能;这不是工作原理

AJAX调用可能永远不会返回

父函数应该触发验证请求,然后假设该请求无效(例如,禁用提交按钮)或显示“我在思考”反馈(旋转指示器)

然后AJAX返回处理函数将清除这些部分(通过启用按钮或将指示器更改为绿色复选标记或红色X)。如果AJAX调用从未通过,它将保持无效。如果真的通过了,那就是清理的时候了

如果不是,如何根据ajax请求的结果从父函数返回true/false

你不能;这不是工作原理

AJAX调用可能永远不会返回

父函数应该触发验证请求,然后假设该请求无效(例如,禁用提交按钮)或显示“我在思考”反馈(旋转指示器)


然后AJAX返回处理函数将清除这些部分(通过启用按钮或将指示器更改为绿色复选标记或红色X)。如果AJAX调用从未通过,它将保持无效。如果它确实通过了,那就是清理发生的时间。

有效的将被更新,是的。但是:AJAX调用是异步的,也就是说,您的函数肯定会在父函数返回后被调用。无法等待异步进程完成。

将更新Valid,是的。但是:AJAX调用是异步的,也就是说,您的函数肯定会在父函数返回后被调用。无法等待异步进程完成。

虽然您可以从内部函数设置变量,但由于内部函数是在post异步完成后调用的,因此不会及时为返回设置内部函数。根据您尝试执行的操作,您可以通过让回调函数简单地调用根据返回值发生的操作来处理它。例如,如果您正在单击一个您希望在发布成功时获取的链接,请从ValidateMething函数返回false,然后在成功发布后从链接中获取href并使用其值设置location.href以模拟所单击链接的效果(无需重新运行验证函数)。根据您尝试执行的操作,您可以通过让回调函数简单地调用根据返回值发生的操作来处理它。例如,如果您正在单击一个您希望在发布成功时获取的链接,请从ValidateMething函数返回false,然后在成功发布后从链接中获取href并使用其值设置location.href以模拟所单击链接的效果(无需重新运行验证函数).

但这都是表单验证过程的一部分。因此,我的代码遍历所有字段(单击submit时),验证所有字段,如果所有验证函数都返回true,则提交formI,并在此处回答:。。。你甚至接受了。async:false是关键。请在另一个问题中问这个问题:“如何在AJAX验证的结果中提交表单?”因为它有一些我想解决的小问题。但这都是作为表单验证过程的一部分完成的。因此,我的代码遍历所有字段(单击submit时),验证所有字段,如果所有验证函数都返回true,则提交formI,并在此处回答:。。。你甚至接受了。async:false是关键。请在另一个问题中问这个问题:“我如何提交一个表单作为AJAX验证的结果?”因为它有两个我想解决的子问题。它作为循环的一部分完成,该循环是从另一个函数调用的(在我的示例中是ValidateMething()之外)..然后我将重构您的验证逻辑以处理异步调用,或者更改为使用ajax方法并指定async=false。这是作为从另一个函数调用的循环的一部分来完成的(在我的示例中,ValidateMething()之外)..然后我要么重构验证逻辑以处理异步调用,要么更改为使用ajax方法并指定async=false。