封闭内的jQuery变量可见性

时间:2012-02-02 18:50:45

标签: javascript jquery ajax

关于此代码:

$.each(divList, function(){ 
    var dropdown = '';
    $.get("ajax.php",{'some':'params', 'other':'params'},function(msg){
        dropdown = msg;
        console.log( dropdown );
    });
    console.log( dropdown );
    $(dropdown).appendTo($(this));
});

...第一个日志显示dropdown变量保存从ajax返回的正确文本,第二个是空的(并且appendTo什么都不做)。

有没有办法让这个有效?使用浏览器是否存在依赖性?

3 个答案:

答案 0 :(得分:2)

$.get() 异步:它返回非常快,在后台执行其工作,并通过调用您提供的回调函数发出完成信号。

由于您第二次拨打console.log()以及拨打appendTo()的电话不在回调范围内,因此在$.get()完成并设置dropdown之前,它们会过早运行。< / p>

通常的模式是将appendTo()的调用放在回调函数中:

$.each(divList, function() {
    $.ajax({
        url: "ajax.php",
        data: {
            // your parameters...
        },
        context: this,
        success: function(msg) {
            console.log(msg);
            $(msg).appendTo(this);
        }
    });
});

编辑:如果您想从回调函数中访问原始this引用,可以将其context选项传递给$.ajax(),上面的代码确实如此。

答案 1 :(得分:2)

this分配给函数顶部的变量,以便异步ajax调用可以访问它:

$.each(divList, function(){ 
    var me = this;
    $.get("ajax.php",{'some':'params', 'other':'params'},function(msg){
        var dropdown = msg;
        console.log( dropdown );
        $(dropdown).appendTo($(me));
    });
})

答案 2 :(得分:1)

this的外部范围中的$get分配给新变量,您可以在成功处理程序中访问该变量