2014-01-07 6 views
0

아래와 같이 다른 함수에 OnSuccess을 선언하면 브라우저 개발자 도구 콘솔에 OnSuccess이라는 전역 함수가 없다는 오류가 표시됩니다. 이것으로부터, 다른 함수 내에서 아래처럼 선언 된 함수는 여전히 HTML DOM window 객체의 함수로 올려 짐/고정/처리된다는 것을 추론합니다.JavaScript 함수, 클로저 등의 JavaScript 함수

그런 다음 객체 이니셜 라이저 내에서 멤버를 선언하는 것처럼 OnError을 선언합니다. 그것도 작동하지 않습니다. 내가 할 수있는

한 가지 방법은 AssignBackupOnServer 함수 외부 OnErrorOnSuccess 모두를 이동하지만, 나는 AssignBackupOnServer의 지역 변수를보고 할 수 있도록 OnSuccessOnError을 원하는, 그래서 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와 가까웠지만 참조 할 때 약간 잘못되었습니다.

success: OnSuccess, 
    error: OnError 
}); 

function OnSuccess(data, textStatus, jqXHR) { 
} 

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

감사합니다. :-) 그게 내가 처음에 한 일이지만, 그것이 나에게 오류가 발생했는지 여부를 기억하지 못한다. 그것을 시도하고 당신에게 돌아 가자. –

+0

고맙습니다. 그게 효과가 있었어. :-) –

1

이 처리하는 가장 좋은 방법은 두 기능에 대한 기능 AssignBackupOnServer에 식별자를 선언하고 직접 AssignBackupOnServer의 intstead 그 식별자를 사용하는 것입니다 : 당신은 AssignBackupOnServer. 접두사가 필요하지 않습니다. 내가 무엇을보고 예를 들어

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

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

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

를 들어 당신은 onSuccessonError 기능을 다시 사용하고자하지만, 외부 변수에 액세스 할 수 있습니다. 리차드의 답변이 필요한 경우가 아닙니다. 더 기능적인 접근 방법을 제안한다면 :

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

왜'arguments'에'slice'를 호출해야합니까? 왜 그냥'var args = arguments; '를 할당하지 않는가? –