jQuery变量在闭包中的可见性

jQuery variable visibility inside closure

本文关键字:可见性 闭包 变量 jQuery      更新时间:2023-09-26

在此代码上:

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

第一个日志显示下拉变量包含从ajax返回的正确文本,第二个日志为空(appendTo不执行任何操作)。

有没有办法让它发挥作用?使用的浏览器是否存在某种依赖关系?

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

由于您对console.log()的第二次调用和对appendTo()的调用都在回调之外,因此它们将在$.get()完成并设置dropdown之前运行得太早。

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

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

EDIT:如果您想从回调函数访问原始this引用,可以在context选项中将其传递给$.ajax(),就像上面的代码一样。

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

$get外部作用域中的this分配给一个新变量,您可以在成功处理程序中访问该变量