在Javascript匿名函数内部进行范围设计

时间:2010-04-28 17:13:54

标签: javascript jquery scope anonymous-methods

我正在尝试从ajax调用返回数据,然后我可以使用它。问题是函数本身被许多对象调用,例如:

function ajax_submit (obj)
{   
    var id = $(obj).attr('id');
    var message = escape ($("#"+id+" .s_post").val ());

    var submit_string = "action=post_message&message="+message;

    $.ajax({  
        type: "POST",  
        url: document.location,  
        data: submit_string,  
        success: function(html, obj) {
            alert (html);
        }  
    }); 

    return false;
}

这意味着在匿名'成功'函数内部我无法知道调用obj(或id)实际上是什么。我能想到的唯一方法就是将id附加到文档中,但这看起来有点过于粗糙。还有另一种方法吗?

4 个答案:

答案 0 :(得分:7)

您可以使用封闭范围内的变量,这种技术称为“闭包”。所以:

function ajax_submit (obj)
{   
    var id = $(obj).attr('id');
    var message = escape ($("#"+id+" .s_post").val ());

    var submit_string = "action=post_message&message="+message;

    $.ajax({  
        type: "POST",  
        url: document.location,  
        data: submit_string,  
        success: function(html) {
            alert(obj.id);  // This is the obj argument to ajax_submit().
            alert(html);
        }  
    }); 

    return false;
}

答案 1 :(得分:4)

如果您尝试通过ajax将html加载到页面上,则可能需要考虑load()函数。

答案 2 :(得分:2)

JavaScript中的函数包含在定义它们的范围内(这是closure)。在这种情况下,每次调用ajax_submit()时都会创建一个新的匿名成功回调函数,因此始终可以访问父作用域中的所有变量。

您的代码应该可以正常工作。如果你想要一个回调函数,可以将它作为参数传递给ajax_submit()并像这样调用:

…
success: function(html, obj) {
    callback(html);
}
…

答案 3 :(得分:0)

变量objidmessage都可以在匿名函数中使用。

这是因为Javascript中的一项功能称为 闭包 ,我建议您仔细阅读。

闭包的一般要点是函数将永远可以访问其定义的范围中存在的变量。

结果是你可以这样做:

    success: function(html) {
        alert (id);
        alert (obj);
    } 

整天(但请注意,success函数中的obj参数优先于ajax_submit函数中的obj变量。)