Javascript 不确定为什么变量未定义。可能的范围问题?

Javascript 不确定为什么变量未定义。可能的范围问题?,javascript,Javascript,如果您查看下面的函数,在第11行,它警报(模板)。它打印未定义的。如果我警报(模板)在ajax成功回调中,它不会打印任何问题。因为模板是在函数的顶部定义的,所以它不应该在整个函数中都是全局的吗?有人能帮我吗 function load_template(path, data, callback){ var template; $.ajax({ url: path, success: function(uncompiled_template){

如果您查看下面的函数,在第11行,它
警报(模板)。它打印未定义的
。如果我<代码>警报(模板)在ajax成功回调中,它不会打印任何问题。因为模板是在函数的顶部定义的,所以它不应该在整个函数中都是全局的吗?有人能帮我吗

function load_template(path, data, callback){
    var template;

    $.ajax({
        url: path,
        success: function(uncompiled_template){
            template = Handlebars.compile(uncompiled_template);
        }
    });

    alert(template);    

    if(callback){
        callback(template, data);
    }else{
        return template(data);
    }
}

ajax是异步的。简单地解释一下:ajax的工作原理就像它在一个单独的“线程”上运行一样,在代码继续运行的同时在后台进行处理

当您调用
load\u template()
时,它会在调用
$之后发出警报。ajax()
在返回模板之前发出警报,因此
未定义

您可以这样做,以便在返回成功后运行所有内容:

function load_template(path, data, callback){

    $.ajax({
        url: path,
        success: function(uncompiled_template){
            var template = Handlebars.compile(uncompiled_template);

            alert(template);    

            if(callback){
                callback(template, data);
            }else{
                return template(data);
            }
        }
    });
}

不,这不是范围问题,而是时间问题

AJAX调用是异步的,因此成功回调将在响应到达后运行。当您尝试使用该变量时,该变量还没有设置

无法从函数返回值,因为在退出函数之前,成功回调永远不会运行。始终使用发送到函数的回调:

function load_template(path, data, callback){

    $.ajax({
        url: path,
        success: function(uncompiled_template){
            var template = Handlebars.compile(uncompiled_template);
            callback(template, data);
        }
    });

}

在ajax请求完成之前,不会定义模板

这就是为什么它在成功函数中显示良好


不确定那是什么框架(我猜是JQuery),但您需要在ajax成功函数中执行回调。

成功函数是回调函数。javascript引擎向服务器发出请求,当服务器响应数据时,它运行
success
函数,您就拥有了数据,因此
success
函数在最后的if语句之后运行,即使它是预先定义的


Javascript代码在一个,all
$中运行。ajax
所做的是启动一个异步事件,并指定该事件发生时要做什么。

Ok。这是有道理的。如何从load_template函数返回模板变量。建议?@Kylee:如果您确实需要返回值,您可以改为进行同步AJAX调用(在设置中使用
async:false
)。但是,这将在等待响应时冻结整个浏览器。确定。这不是加载和呈现模板的最佳解决方案。谢谢你的后续回答。