Неопределенное значение jQuery при попытке исправить жалобу JSLint: «Не создавать функции в цикле» - PullRequest
2 голосов
/ 24 сентября 2010

В jjuery-функции ajax данные, передаваемые в функцию обратного вызова при успешном завершении, определяются с помощью

success: function (data) { ...

, но это делает JSLint несчастным («Не выполнять функции в цикле»).

Если я последую предложению в Как исправить ошибку jslint «Не выполнять функции внутри цикла.»? , Firebug жалуется, что «данные не определены» и функция обратного вызова завершается ошибкой.

Пример:

До $(document).ready(function(){

function ajaxSuccess() {
   return function (data) {
      alert (data);
   };
}

Внутри $(document).ready(function(){

$.ajax({
    type: "POST",
    url: "some-url-here",
    data: ({ "foo" : "bar" }),
    success: ajaxSuccess(data)
});

приводит к "данные не определены"ошибка.

Но если я изменю это значение на

$.ajax({
    type: "POST",
    url: "some-url-here",
    data: ({ "foo" : "bar" }),
    success: function (data) {
        ajaxSuccess(data);
    }
});

, тогда все будет просто ужасно - но теперь я вернулся туда, где начал, насколько это касается JSLint.

Если я хочу пройти проверку с помощью JSLint, как мне получить data, возвращаемый url, и передать его рассматриваемой функции?

Ответы [ 4 ]

2 голосов
/ 24 сентября 2010

Вам необходимо удалить параметр data из вашего вызова ajaxSuccess(), потому что data не определяется при его вызове:

success: ajaxSuccess()

Или вам действительно не нужноajaxSuccess() вернуть функцию.

function ajaxSuccess(data) {
    alert(data);
}

success: ajaxSuccess

РЕДАКТИРОВАТЬ:

На основе вашего комментария вы можете вызвать ajaxSuccess(), как вы были, ипередавайте ему любые параметры, если они определены.

function ajaxSuccess( param ) {
   return function (data) {
      alert (param);
      alert (data);
   };
}

success: ajaxSuccess( "someParameter" )
2 голосов
/ 24 сентября 2010

success: нужна функция, но вам не нужно создавать ее только для нее.

   function ajaxSuccess(data) 
   { 
     alert (data); 
   }
 // :
 // :

$.ajax({ 
    type: "POST", 
    url: "some-url-here", 
    data: ({ "foo" : "bar" }), 
    success: ajaxSuccess     // note: no parameters, just the name.
    } 
});   

Первоначально вы говорили "создать новую функцию, которая принимает параметр данных, иназначьте его на success ".Моя версия говорит: «У меня уже есть функция, которая принимает параметр данных (названный ajaxSuccess). Назначьте его для успеха».

0 голосов
/ 24 сентября 2010

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

Пример

// uncalled
var ajaxSuccess = function(){};     // typeof(ajaxSuccess) == 'function'
//called
var ajaxSuccess = function(){}();   // typeof(ajaxSuccess) == 'undefined'
  • Функция без оператора возврата возвращает неопределенное значение, когда call
  • Вызванная функция запускается немедленно (вот почемуэто говорит о том, что данные не определены)
  • Назначение не вызванной функции является ссылкой на эту функцию (может быть вызвано в более поздний момент времени)
  • Назначение вызываемой функции является возвращениемоператор этой функции
0 голосов
/ 24 сентября 2010

вы никогда не принимаете данные в качестве параметра в своем определении ajaxSuccess.

...