Обзорное внутри анонимной функции в JavaScript


Я пытаюсь сделать функцию, возвращающую данные из вызова 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" у меня нет способа узнать, что такое вызывающий obj (или id) на самом деле. Единственный способ, который я могу придумать, это прикрепить id к документу, но это просто кажется слишком грубым. Есть ли другой способ сделать это?

4 3

4 ответа:

Вы можете использовать переменные из заключающей области, метод называется "закрытие". Итак:

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

Если вы пытаетесь загрузить html на страницу с помощью ajax, вы можете рассмотреть функцию load () .

Функции в JavaScript становятся заключенными в область, в которой они определены (этозакрытие ). В этом случае при каждом вызове ajax_submit() создается новая анонимная функция обратного вызова успеха, поэтому все переменные из родительской области всегда будут доступны.

Ваш код должен работать просто отлично, как есть. Если вы хотите иметь функцию обратного вызова, ее можно передать в качестве аргумента в ajax_submit() и вызвать следующим образом:

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

Переменные obj, id и message все они доступны в анонимной функции.

Это происходит из-за функции в Javascript под названием затворы, О чем я советую Вам почитать.

Общая суть замыкания состоит в том, что функция всегда будет иметь доступ к переменным, которые присутствовали в области, в которой она была определена.

Результатом этого является то, что вы можете сделать:

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

В течение всего дня (но обратите внимание, что параметр obj в функция success будет иметь приоритет над переменной obj в вашей функции ajax_submit.)