2016-01-20 45 views
-1

我们最近观察到使用jQuery ajax时的行为,并想验证它是否合理。ajax GET和POST中的变量范围

例如,假设下面的代码:

function validate(e, inurl, formid, foo) { 
    var v = $("#" + formid).serialize(); 
    $.ajax({ 
     url: inurl, 
     type: 'POST', // *** type here matters 
     data: v, 
     dataType: "JSON", 
     success: function (data) { 
      // *** e, inurl, formid, including v would all be undefined here 
      // *** however, if ajax call type is GET, those variables would be valid 
      // *** on the other hand, foo as a callback is preserved regardless 
      if (foo) 
       foo(data); 
     } 
    });  
} 

这是一个设计的行为,所以我们一定会用得到,如果我们需要保持这些变量?如果是这样,任何相关的文件将不胜感激。

+1

找出一个简单的方法是运行它,看看它们在通话后是否仍然存在。我建议学习功能和变量范围。 –

+2

“我们最近观察到一种行为” - 您一定误解了您所看到的内容。这不是JavaScript的工作原理。 – Quentin

+0

你知道Ajax是异步运行!在你的成功函数中意味着你只能访问全局变量v肯定是未定义的,e inurl formid和foo将是未定义的,除非它们是全局变量而不管你使用get或post方法 – lyz

回答

0

在玩了一会之后,我想我正在用错误的方式来证明这些变量是否有效。我所做的是我在if (foo)之前放置了一个断点,并使用浏览器的控制台检查了这些变量没有任何语句在success回调中访问它们。因为即使ajax是异步运行的,只要它在父函数中,它就可以基于javascript关闭访问该函数的变量(参考:http://www.w3schools.com/js/js_function_closures.asp)。但是,只有在回调中引用它们时,才是真实的。 console.log(e)。这样,它们在父函数返回之前被捕获。当回调稍后触发时,这些变量仍然有效。希望这会消除混淆。感谢所有评论。