js高階技巧之惰性載入函式
阿新 • • 發佈:2019-03-10
- 因為瀏覽器間行為的差異,多數javascript程式碼包含大量的if判斷語句,為避免每次函式呼叫都去執行那些沒有必要的if判斷語句
- 實現惰性載入函式的方法有兩種:
- 在函式執行的時候在處理函式,在函式第一次呼叫的過程中,該函式會被重寫覆蓋成另一個按照合適方式執行的函式,下面見例子:建立XHR
每次執行這個建立函式都會去執行內部的那些判斷語句,所以見如下改寫該函式,重寫原函式,下一次呼叫時就會直接呼叫分配好的函式function createXHR () { if (typeof XMLHttpRequest != 'undefined') { return new XMLHttpRequest(); } else if (typeof ActiveXObject != 'undefined') { if (typeof arguments.callee.activeXString != 'string'){ var version = ['MSXML2.XMLHttp.6.3', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp'], i,len; for (i = 0,len=version.length; i < len; i++) { try { new ActiveXObject(version[i]); arguments.callee.activeXString = versions[i]; break; } catch (ex) { // 跳過 } } } return new ActiveXObject(arguments.callee.activeXString); } else { throw new Error('NO XHR'); } }
function createXHR () { if (typeof XMLHttpRequest != 'undefined') { // 改寫原函式 createXHR = function () { return new XMLHttpRequest(); } } else if (typeof ActiveXObject != 'undefined') { // 改寫原函式 createXHR = function () { if (typeof arguments.callee.activeXString != 'string'){ var version = ['MSXML2.XMLHttp.6.3', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp'], i,len; for (i = 0,len=version.length; i < len; i++) { try { new ActiveXObject(version[i]); arguments.callee.activeXString = versions[i]; break; } catch (ex) { // 跳過 } } } return new ActiveXObject(arguments.callee.activeXString); } } else { createXHR = function () { throw new Error('NO XHR'); } } // 最後返回預期 return createXHR(); }
- 第二種惰性載入的方式是在宣告函式時就指定適當的函式,見下面改寫,該例子中使用匿名、自執行函式:
var createXHR = (function () { if (typeof XMLHttpRequest != 'undefined') { // 返回分配好的函式 return function () { return new XMLHttpRequest(); }; } else if (typeof ActiveXObject != 'undefined') { // 返回分配好的函式 return function () { if (typeof arguments.callee.activeXString != 'string'){ var version = ['MSXML2.XMLHttp.6.3', 'MSXML2.XMLHttp.3.0', 'MSXML2.XMLHttp'], i,len; for (i = 0,len=version.length; i < len; i++) { try { new ActiveXObject(version[i]); arguments.callee.activeXString = versions[i]; break; } catch (ex) { // 跳過 } } } return new ActiveXObject(arguments.callee.activeXString); }; } else { return function () { throw new Error('NO XHR'); }; } })()
- 在函式執行的時候在處理函式,在函式第一次呼叫的過程中,該函式會被重寫覆蓋成另一個按照合適方式執行的函式,下面見例子:建立XHR