Области видимости внутри Javascript анонимных функций - PullRequest
3 голосов
/ 28 апреля 2010

Я пытаюсь заставить функцию возвращать данные из вызова ajax, которые я затем могу использовать. Проблема заключается в том, что сама функция вызывается многими объектами, например ::100100

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 к документу, но это кажется слишком грубым. Есть ли другой способ сделать это?

Ответы [ 4 ]

7 голосов
/ 28 апреля 2010

Вы можете использовать переменные из прилагаемой области видимости, технику, называемую «замыкание». Итак:

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;
}
4 голосов
/ 28 апреля 2010

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

2 голосов
/ 28 апреля 2010

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

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

…
success: function(html, obj) {
    callback(html);
}
…
0 голосов
/ 28 апреля 2010

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

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

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

В результате вы можете:

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

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

...