2014-01-07 48 views
0

當我在下面的另一個函數中聲明OnSuccess時,瀏覽器開發人員工具控制檯指出在全局範圍內沒有稱爲OnSuccess的函數的錯誤。因此,我推斷在另一個函數內部聲明的任何函數仍然作爲HTML DOM window對象的函數被掛起/固定/處理。JavaScript函數內部的JavaScript函數,閉包等

然後,我聲明OnError像你聲明一個對象初始值設定項內的成員。那也行不通。我可以做

的方法之一是移動這兩個OnErrorOnSuccessAssignBackupOnServer功能之外,但我想OnSuccessOnError能夠看AssignBackupOnServer的局部變量,所以我的AssignBackupOnServer函數內聲明它。

如果我想讓包含的lambda在其包含/封閉函數的捕獲變量上展示閉包,那麼關於此聲明的正確方法是什麼?

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

爲了什麼我看你是願意重用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;'? –