JQuery和JS变量

时间:2010-07-01 14:34:57

标签: jquery javascript

对JQuery和JS变量有点误解。简单的例子:

function someFunc(){

   var flag = true;

    $(function(){
        $.post("/some/address/", {} ,function(data){
            if( data == false){             
                flag = false;
            }
        });
    });
   if(flag == false){
      return false;
   }    
} 

主要问题是Jquery函数中变量标志的可访问性。我总是得到相同的标志值等于true。如何做到这一点?如何使全局变量对JS和JQuery可见?

6 个答案:

答案 0 :(得分:7)

我认为你的问题不是范围,实际上;我认为你的问题是post函数是异步的。也就是说,它会在服务器上获取数据,并在数据返回时运行回调函数(更新标志)(这可能需要一段时间)。但同时,周围的功能还在继续;它不会等待post返回。因此,在外部函数返回后发生标志更新。

答案 1 :(得分:4)

您正在进行两项异步操作:

  • $(function(){}) - 当文档“准备好”时触发功能
  • $.post - 触发XHR请求

这些都不会立即返回,例如一个XHR请求需要时间才能完成 - 这就是你传递一个回调函数的原因(这样你就可以在完成时做东西)。

当这些操作正在发生时,你的JS将继续执行,这意味着:

if(flag == false){
   return false;
}

...在任一操作(最好只是$.post操作)完成之前执行。

答案 2 :(得分:1)

AJAX回调仅在您返回后执行。

因此,当您撰写if(flag == false)时,post回调尚未执行,因此flag仍为true

答案 3 :(得分:0)

乍看之下,通过设置flag = 'false'(将'false'设为字符串)而不是flag = false设置为bool,对flag == false的测试将永远不会成立。

<强>更新

此外,您的jQuery代码正在发布一个帖子,该帖子的返回时间远早于flag == false的检查。似乎你认为代码完全以线性方式运行,但是你设置flag == false的回调方法将在很晚的时候被调用。

答案 4 :(得分:0)

问题是稍后调用回调函数,因为AJAX是异步的。 $.post立即返回,当flag仍为false时执行下一行。

答案 5 :(得分:0)

$(function(){ ... })$.post("address", function() { ... })不会阻止。因此,在js-interpreter命中...之前,不会执行if(flag == false)处的回调代码。它相当于:

var flag = true;
doSomethingLater();
if(flag == false)
  ...

flag始终为true

删除$(function(){ ... })并使用async: false option获取ajax请求。