回调和范围

时间:2008-12-19 16:49:59

标签: javascript jquery

我发现在尝试学习Jquery时要完全理解回调范围有一些问题。我想补充一点,我对Javascript语言的经验很少代码:

var globDom;    // placeholder for DOM fragment

// Getting xml file; jquery parses the file and give me back a DOM fragment
// saveXML is the callback

$.get(requestTarget, {}, saveXML);

// the globDom here is UNDEFINED !

alert(globDom);

// the callback

function saveXML(xmlDom)
{
    globDom = xmlDom;
}

我确信这里有一个很大的误解......

有什么建议吗?

由于

丹尼尔


阿阿。非常清楚,我完全理解我的假设中的错误:我忘记考虑到数据访问时间(之前的!)和内容可用时间之间的时间间隔。一个相当严重的缺陷 - 批处理编程有偏见:-(问题很明显,我现在可以正确地解决它。很多,非常感谢您的回应!

4 个答案:

答案 0 :(得分:6)

我自己没有使用过jquery,但我的理解是它所做的很多事情都是异步的。该get方法可能不会立即调用您的回调。在尝试访问globDom之前,您需要等到回调运行之后。

尝试在回调方法中添加提醒。这个是在get()之后发出警报之前或之后发生的吗?

答案 1 :(得分:4)

基本上,您需要将任何与返回数据一起使用的代码放在回调本身或从回调调用的函数中,因为在此之前数据不存在。

例如:

// Getting xml file; jquery parses the file and give me back a DOM fragment
// saveXML is the callback

$.get(requestTarget, {}, saveXML);

// the callback

function saveXML(xmlDom)
{
    // the xmlDom here is DEFINED !

    alert(xmlDom);
}

答案 2 :(得分:1)

我认为你的范围很好。 saveXML创建一个闭包,其中包含范围内的globDom。如果您不熟悉该术语,则闭包意味着函数定义的范围包含在该函数体的范围内。这意味着因为globDom属于saveXML定义的范围,所以saveXML的主体可以访问与其上面定义的警报相同的globDom实例。

我认为你的实际问题在于$ .get不同步。 $ .get在获取完成之前立即返回,这意味着在回调运行之前调用alert。相反,您可以使用$ .ajax,并将“async”选项设置为false,这将使$ .ajax调用在服务器请求成功之前不会返回。

但是,最好的解决方案是使代码异常,这样您就可以放弃对浏览器的控制,这样用户在等待服务器请求完成时仍然可以与页面进行交互。

答案 3 :(得分:0)

赫尔姆斯说的话。您的(简化)时间表看起来像

0.001 globdom = undefined;
0.002 $.get(somerequest, callback)
0.003 alert(globdom)

.. 50 milliseconds later ..

0.053 saveXml(xmlDom)