代码之家  ›  专栏  ›  技术社区  ›  DCD

Javascript匿名函数中的作用域

  •  3
  • DCD  · 技术社区  · 16 年前

    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 回复  |  直到 16 年前
        1
  •  7
  •   Max Shawabkeh    16 年前

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

    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;
    }
    
        2
  •  4
  •   Joel    16 年前

    load() 功能。

        3
  •  2
  •   s4y    16 年前

    JavaScript中的函数被封闭在定义它们的范围内(这是一个 closure ). 在这种情况下,每次都会创建一个新的匿名成功回调函数 ajax_submit()

    你的代码应该可以正常工作。如果您想拥有一个回调函数,可以将其作为参数传递给 并这样称呼:

    …
    success: function(html, obj) {
        callback(html);
    }
    …
    
        4
  •  0
  •   Matt user129975    16 年前

    变量 obj , id message 都可以在匿名函数中使用。

    这是因为Javascript中的一个特性 闭包 ,我建议你仔细阅读。

    闭包的一般要点是函数将永远有权访问它所定义的范围中存在的变量。

    其结果是您可以:

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

    一整天(但请注意 success函数中的参数将优先于 目标 变量)

    推荐文章