JavaScript匿名函数内的作用域

3

我正在尝试创建一个函数,从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;
}

这意味着在匿名的“success”函数内部,我无法知道调用的对象(或id)实际上是什么。我能想到的唯一方法是将id附加到文档中,但那似乎有点粗糙。是否有其他方法可以做到这一点?

4个回答

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

我尝试过了,但似乎在成功函数内obj并没有被设置。 - DCD
1
在你的例子中,success 函数有一个名为 obj 的第二个参数,它隐藏了原来的变量。你是否像我在答案中那样将其删除了? - Max Shawabkeh

4
如果你正在尝试通过ajax加载HTML到页面上,你可能想考虑使用 load() 函数。

2
JavaScript中的函数被封闭在定义它们的作用域中(这就是闭包)。在这种情况下,每次调用ajax_submit()时都会创建一个新的匿名成功回调函数,因此来自父级作用域的所有变量始终可访问。
您的代码应该可以正常工作。如果您想要一个回调函数,它可以作为参数传递给ajax_submit()并像这样调用:
…
success: function(html, obj) {
    callback(html);
}
…

0

匿名函数内部可以使用变量 objidmessage

这是因为 JavaScript 中有一个叫做闭包的特性,我建议你了解一下。

闭包的基本概念是,一个函数将永远可以访问在其定义的作用域内存在的变量。

由此产生的结果是,你可以这样做:

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

整天都在编程(但请注意,成功函数中的obj参数将优先于您的ajax_submit函数中的obj变量。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接