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

时间:2012-02-17 23:53:28

标签: javascript

如果您查看下面的功能,请在第11行alert(template);处查看。它打印undefined。如果我在ajax成功回调中alert(template);,它打印没有问题。由于模板是在函数顶部定义的,因此整个函数不应该是全局的吗?有人可以帮助我吗?

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);
    }
}

4 个答案:

答案 0 :(得分:8)

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

AJAX调用是异步的,因此成功回调会在响应到来时运行。当您尝试使用它时,该变量尚未设置。

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

function load_template(path, data, callback){

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

}

答案 1 :(得分:1)

ajax是异步的。用简单的术语来解释:ajax 就像一样运行在一个单独的“线程”上,在你的代码继续的同时在后台处理。

当您致电load_template()时,它会在$.ajax()被称为之后但在返回模板之前发出警报,因此undefined

你能做的就是这样一切都在成功回归后运行:

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);
            }
        }
    });
}

答案 2 :(得分:0)

在您的ajax请求完成之前,

模板尚未定义。

这就是为什么它在成功函数中表现良好。

不确定是什么框架(我认为是JQuery)但你需要在ajax成功函数中进行回调。

答案 3 :(得分:0)

success函数回调。 javascript引擎向服务器发出请求,当服务器响应数据时,然后它运行success函数并且你有数据,所以success函数在结束后在之后运行,即使事先定义了它。

Javascript代码在Event Loop内运行,所有$.ajax正在做的是启动一个异步事件并指定该事件发生时该怎么做。