javascript解析

javascript解析,javascript,Javascript,我有一段代码: $(document).ready(function() { //<![CDATA[ var who; FB_RequireFeatures(["Api"], function(){ var who = api.get_session().uid; alert(who); }); alert("the uid is: "+who); //]]> });

我有一段代码:

$(document).ready(function() {
    //<![CDATA[  
    var who;

    FB_RequireFeatures(["Api"], function(){ 

        var who = api.get_session().uid;
        alert(who);

        });

        alert("the uid is: "+who);

    //]]> 
});
$(文档).ready(函数(){
// 
});
问题是: FB_RequireFeatures块外部的代码在其内部代码之前执行。 因此,
who
的值是未定义的


我做错了什么?

FB\u RequireFeatures函数似乎正在进行异步调用,因此您没有做错任何事情,这就是它的工作方式-在请求返回之前调用警报

您必须设计代码,使依赖于
FB\u RequireFeatures
函数结果的代码仅在请求完成后调用。您可以在回调函数中调用另一个函数,例如:

var who;

$(document).ready(function() {        
    FB_RequireFeatures(["Api"], function() {
        who = api.get_session().uid;
        doSomeOtherStuff();
    });
});

function doSomeOtherStuff() {
    alert("the uid is: " + who);
}
现在,
doSomeOtherStuff
函数只有在
FB\u RequireFeatures
函数完成后才被调用,您应该在
doSomeOtherStuff
函数中执行以下所有代码–显然,您可以将其命名为任何您想要的代码


我将
who
变量移出ready块,以将其保留在
doSomeOtherStuff
函数的范围内,并从内部函数中删除
var
,以便您引用原始变量,而不是创建新变量,否则也一样。

FB\u RequireFeatures函数似乎正在进行异步调用,因此您没有做错任何事情,这就是它的工作方式-在请求返回之前调用警报

您必须设计代码,使依赖于
FB\u RequireFeatures
函数结果的代码仅在请求完成后调用。您可以在回调函数中调用另一个函数,例如:

var who;

$(document).ready(function() {        
    FB_RequireFeatures(["Api"], function() {
        who = api.get_session().uid;
        doSomeOtherStuff();
    });
});

function doSomeOtherStuff() {
    alert("the uid is: " + who);
}
现在,
doSomeOtherStuff
函数只有在
FB\u RequireFeatures
函数完成后才被调用,您应该在
doSomeOtherStuff
函数中执行以下所有代码–显然,您可以将其命名为任何您想要的代码


我将
who
变量移出ready块,以将其保留在
doSomeOtherStuff
函数的范围内,并从内部函数中删除
var
,以便您引用原始变量,而不是创建新变量,否则它是相同的。

您正在创建一个新的本地
who
变量。从设置who的位置删除
var
。此外,在对FB_RequireFeatures函数的回调运行之前,您不能引用
who

您正在创建一个新的本地
who
变量。从设置who的位置删除
var
。此外,在对FB_RequireFeatures函数的回调运行之前,您不能引用

如何确保函数后面的代码在FB_RequireFeatures请求完成后得到执行?这确实有些帮助。但是可以做些什么让FB_RequireFeatures之后的代码显式地等待FB_RequireFeatures完成吗?我尝试了上面的方法。出于某种原因,someotherfunction()中的代码仍在ajax调用完成之前执行?@amit:不,不能将异步执行代码转换为同步执行代码,反之亦然。当
FB\u RequireFeatures
完成时,所有要运行的代码都必须作为回调函数传递给它。如何确保函数后面的代码在FB\u RequireFeatures完成请求后执行?这确实有点帮助。但是可以做些什么让FB_RequireFeatures之后的代码显式地等待FB_RequireFeatures完成吗?我尝试了上面的方法。出于某种原因,someotherfunction()中的代码仍在ajax调用完成之前执行?@amit:不,不能将异步执行代码转换为同步执行代码,反之亦然。当
FB\u RequiresFeatures
完成时,所有要运行的代码都必须作为回调函数传递给它。