2014-01-07 3 views
0

Когда я объявляю OnSuccess внутри другой функции, как показано ниже, консоль инструментов разработчика браузера указывает на ошибку, что в глобальной области нет функции с именем OnSuccess. Из этого я делаю вывод, что любые функции, объявленные как ниже внутри другой функции, все еще вставлены/закреплены/обработаны как функции объекта HTML DOM window.Функции JavaScript внутри функций JavaScript, закрытий и т. Д.

Затем объявляю OnError, как вы объявляете элемент внутри инициализатора объекта. Это тоже не работает.

Один способ, которым я мог сделать, это движение как OnError и OnSuccess вне функции AssignBackupOnServer, но я хочу OnSuccess и OnError, чтобы иметь возможность смотреть на локальные переменные AssignBackupOnServer, поэтому я объявил его в функции AssignBackupOnServer.

Каков правильный способ обхода этого объявления, если я хочу, чтобы содержащаяся лямбда обнаружила замыкание на захваченных переменных своей содержащей/охватывающей функции?

function AssignBackupOnServer(mainGuyUId, backupUId, backupFirstName, backupLastName) { 

    var url = '/Foo/SearchForBackup'; 

    $.ajax(url, 
     { 
      cache: false, 
      async: false, 
      type: 'POST', 
      data: JSON.stringify(
      { 
       'mainGuyUId': mainGuyUId, 
       'backupUId': backupUId, 
       'backupFirstName': backupFirstName, 
       'backupLastName': backupLastName 
      }), 
      dataType: 'json', 
      contentType: 'application/json', 
      success: AssignBackupOnServer.OnSuccess, 
      error: AssignBackupOnServer.OnError 
     }); 

    function OnSuccess(data, textStatus, jqXHR) { 
     // I want to use mainGuyUId, backupUId, 
     // backupFirstName, and backupLastName 
     // here and therefore, I want this function 
     // to exhibit a closure on its containing lambda 
     // so I have declared it here 
    } 

    OnError : function(jqXHR, textStatus, errorThrown) { 
    } 
} 

ответ

1

Вы были близки к OnSuccess, но только слегка ошибались, ссылаясь на него. Вам не нужно AssignBackupOnServer. префикс:

success: OnSuccess, 
    error: OnError 
}); 

function OnSuccess(data, textStatus, jqXHR) { 
} 

function OnError(jqXHR, textStatus, errorThrown) { 
} 
+0

Спасибо. :-) Это то, что я сделал сначала, но я не могу вспомнить, вызвало ли я ошибку или нет. Пожалуйста, позвольте мне попробовать и вернуться к вам. –

+0

Спасибо. Это сработало. :-) –

1

Лучший способ справиться с этим, чтобы объявить идентификатор в функции AssignBackupOnServer для обеих функций и использовать эти идентификаторы непосредственно intstead из AssignBackupOnServer. Например

function onSuccess(data, textStatus, jqXHR) { 
    ... 
} 

function onError(jqXHR, textStatus, errorThrown) { 
    ... 
} 

$.ajax(url, 
     { 
     ... 
      success: onSuccess, 
      error: onError 
     }); 
0

За то, что я вижу, что вы готовы повторно использовать onSuccess и onError функции, но доступ к внешним переменным. Если это не так, то ответ Ричарда - это то, что вам нужно. Если бы я предложил более функциональный подход:

function makeSuccess(mainGuyUId, backupUId, backupFirstName, backupLastName){ 
    return function(data, textStatus, jqXHR){ 
    // Here you have access to everything 
    // and you can use the function elsewhere 
    } 
} 

function makeError(mainGuyUId, backupUId, backupFirstName, backupLastName){ 
    return function(jqXHR, textStatus, errorThrown){ 
    // Here you have access to everything 
    // and you can use the function elsewhere 
    } 
} 

function AssignBackupOnServer(mainGuyUId, backupUId, backupFirstName, backupLastName) { 
    var args = Array.prototype.slice.call(arguments); 
    var url = '/Foo/SearchForBackup'; 

    $.ajax(url, 
    { 
     //... 
     success: makeSuccess.apply(this,args), 
     error: makeError.apply(this,args) 
    }); 
} 
+0

Зачем вам нужно было называть 'slice' на' arguments'? Почему бы просто не назначить 'var args = arguments;'? –

Смежные вопросы