2017-10-13 55 views
0

在教科書中找到以下功能。它應該創建最新版本的XHR對象。返回創建的XHR對象的位置

function createXHR(){ 
    if (typeof arguments.callee.activeXString != "string"){ 
     var versions = ["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"], 
     i, len; 

     for(i=0, len=versions.length; i<len; i++){ 
      try { 
       new ActiveXObject(versions[i]); 
       arguments.callee.activeXString=versions[i]; 
       break; 
      }catch(ex){ 
       //skip 
      } 
     } 

    } 
    return new ActiveXObject(arguments.callee.activeXString); 
} 

我的問題是:爲什麼我們不能只返回for循環內的對象?像這樣的東西:

function createXHR(){ 
    if (typeof arguments.callee.activeXString != "string"){ 
     var versions = ["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"], 
     i, len; 

     for(i=0, len=versions.length; i<len; i++){ 
      try { 
       arguments.callee.activeXString=versions[i]; 
       return new ActiveXObject(versions[i]); 
      }catch(ex){ 
       arguments.callee.activeXString = undefined; 
      } 
     } 

    } 
} 

這兩個看起來相當於我。

回答

2

爲什麼我們不能只返回for循環內的對象?

你當然可以。 (該break;是你的第二個例子是不必要的。)

但是,你需要允許,第三等來電createXHR,當前您的第二個代碼塊沒有。在已有activeXString(例如,else)的情況下,您需要執行new ActiveXObject(arguments.callee.activeXString)

我也建議拋出一個錯誤,如果他們都沒有工作。


請注意,這是所有過時和IE瀏覽器,但。創建XHR對象的正確方法是:new XMLHttpRequest(...)只有在XMLHttpRequest不存在的情況下,纔會回顧這些過時的做法(例如,如果您需要在其「損壞的」兼容模式下支持IE8或IE9-IE11 「)。

另一個注意事項:在代碼中使用arguments.callee總是不必要的,它不再在嚴格模式下工作(並且嚴格模式是您想使用的)。所以,應該使用createXHRcreateXHR.activeXString = ...

因此,例如:

function createXHR() { 
    if (typeof XMLHttpRequest !== "undefined") { 
     return new XMLHttpRequest; 
    } 
    // Obsolete-IE-only fallbacks 
    if (typeof createXHR.activeXString != "string") { 
     var versions = ["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"], 
      i, len; 

     for (i = 0, len = versions.length; i < len; i++) { 
      try { 
       createXHR.activeXString = versions[i]; 
       return new ActiveXObject(versions[i]); 
      } catch (ex) { 
       createXHR.activeXString = undefined; 
      } 
     } 

     throw new Error("No XHR available"); 
    } else { 
     return new ActiveXObject(createXHR.activeXString); 
    } 
} 
+0

刪除了'打破;'在第二個例子。 – Sahand

+0

@Sandi:還有第二個問題,我已經更新了提及它的答案。 –

+0

感謝您提供非常詳細的答案。 還有一個問題:在你的added else子句中,如果'new ActiveXObject(createXHR.activeXString);'會拋出一個異常,則不會處理這個異常。爲什麼不? – Sahand