【问题标题】:Scoping inside Javascript anonymous functionsJavascript匿名函数内的范围
【发布时间】:2011-02-13 11:17:28
【问题描述】:

我正在尝试让一个函数从我可以使用的 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 附加到文档中,但这似乎有点太粗糙了。还有其他方法吗?

【问题讨论】:

    标签: javascript jquery scope anonymous-methods


    【解决方案1】:

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

    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。
    • 在您的示例中,success 的第二个参数称为 obj,它会影响原始参数。您是否像我在答案中那样删除它?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        这是因为 Javascript 中有一个名为 closures 的功能,我建议您阅读一下。

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

        这样做的结果是你可以做到:

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

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

        【讨论】:

          猜你喜欢
          • 2010-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多