原文地址:http://www.cnblogs.com/galenyip/p/4613430.html 我們先來看一下js的非同步提交。 XHR我們在原生的時候常常用到,因為常用到,我們更多把封裝到了工具庫中 先看下他最常用的實現 1 // 舊方法 2 3 function createXHR() {
原文地址:http://www.cnblogs.com/galenyip/p/4613430.html
我們先來看一下js的非同步提交。
XHR我們在原生的時候常常用到,因為常用到,我們更多把封裝到了工具庫中
先看下他最常用的實現
1 // 舊方法 2 3 function createXHR() { 4 var xhr; 5 try{ 6 xhr = new XMLHttpRequest(); 7 }catch(e) { 8 handleErr(e); 9 10 try { 11 xhr = new ActiveXObject("Msxml2.XMLHTTP"); 12 }catch(e) { 13 try{ 14 xhr = new ActiveXObject("Microsoft.XMLHTTP"); 15 }catch(e) { 16 xhr = null; 17 } 18 } 19 } 20 21 return xhr ; 22 } 23 24 function handleErr(error) { 25 // 這一步在實戰中很重要,因為catch會延長作用域鏈,所以是在全局作用域聲明的e 26 // 這裡我們把它賦給局部變數,則查找更快 27 var err = error; 28 29 // do sth. 30 }
沒錯吧?這是最常見的createXHR實現方法了。
那
如題,這裡要說的 惰性函數 是什麼東西呢?
我們先說它的作用: 優化被經常調用到的函數。
這也屬於JS高級中的一部分
不多說,直接上代碼
1 // 惰性函數 2 // 第二次才生效 3 // 作用:優化對於被頻繁使用的函數 4 function createXHR() { 5 var xhr; 6 if(typeof XMLHttpRequest != 'undefined') { 7 xhr = new XMLHttpRequest(); 8 createXHR = function() { 9 return new XMLHttpRequest(); 10 } 11 }else { 12 try { 13 xhr = new ActiveXObject("Msxml2.XMLHTTP"); 14 createXHR = function() { 15 return new ActiveXObject("Msxml2.XMLHTTP"); 16 } 17 }catch(e) { 18 try { 19 xhr = new ActiveXObject("Microsoft.XMLHTTP"); 20 createXHR = function() { 21 return new ActiveXObject("Microsoft.XMLHTTP"); 22 } 23 }catch(e) { 24 createXHR = function () { 25 return null; 26 } 27 } 28 } 29 } 30 return xhr 31 }
代碼中,我們讓函數在第一次運行之後,則判斷除了瀏覽器的環境,就被重新賦值了。賦值後的函數是直接return 對應的方法。
所以,這個函數,需要第二次調用的時候才真正的被調用。
正是因為它第二次調用函數的時候,沒有去走第一次調用那樣複雜的判斷的路,所以顯得“懶惰”。因此我們叫它 惰性函數