2010-04-28 146 views
3

我想从ajax调用中返回一个函数,然后可以使用它。这个问题本身是由许多对象调用的函数,例如:Javascript范围内的匿名函数

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附加到文档中,但这看起来有点太粗糙。有没有另外一种方法呢?

回答

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; 
} 
+0

我试过,但它似乎并不像OBJ设置成功函数中。 – DCD 2010-04-28 17:20:43

+1

在你的例子中,有一个叫'obj'的成功的第二个参数,它影响了原文。你是否像我在答案中那样移除它? – 2010-04-28 17:25:49

+0

是的,那工作,thx。 – DCD 2010-04-28 17:30:24

4

如果您正试图通过你可能要考虑load()功能Ajax加载HTML页面上。

0

变量obj,idmessage都在匿名函数中可用。

这是因为Javascript中的一个功能叫做关闭,我建议你仔细阅读。

一个封闭的一般要点是,一个函数将永远有权访问存在于它在定义范围内的变量

这样做的结果是,你可以这样做:。

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

整天(但要注意的是,在成功的功能obj参数将优先于你ajax_submit功能obj变量)。

2
在JavaScript

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

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

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