函数技巧--惰性加载

xiaoxiao2021-02-28  53

有时候我们写的一段代码,用分支控制语句来决定程序的走向,有时候当运行环境一定的时候,if else 语句就是固定走某一个分支,这样一来,其他不会运行的分支就被浪费了,下面举个例子:

function getXhr(){ var xhr; if("XMLHttpRequest" in window){ xhr=new XMLHttpRequest(); }else if("ActiveXObject" in window) { if(arguments.callee.activeXStr!=="String"){ var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"], i,length; try{ for(i=0;lenth=versions.length;i++){ new ActiveXObject(versions[i]); arguments.callee.activeXStr=version[i]; break; } }catch(err){ } } xhr=new ActiveXObject(versions[i]); }else{ throw("No available XHR"); } return xhr; }

这是一段声明xhr对象的过程,很显然,每次运行这段程序,总是要跑遍每一个分支,但是当在特定的环境中运行时,就会有一部分累赘的代码出现了。这里有2种改进方法。

1.在程序第一次运行时修改function

function getXhr(){ if("XMLHttpRequest" in window){ getXhr=function(){ return new XMLHttpRequest(); } }else if("ActiveXObject" in window) { getXhr=function(){ if(arguments.callee.activeXStr!=="String"){ var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"], i,length; try{ for(i=0;lenth=versions.length;i++){ new ActiveXObject(versions[i]); arguments.callee.activeXStr=version[i]; break; } }catch(err){ } } return new ActiveXObject(versions[i]); } }else{ getXhr=function(){ throw("No available XHR"); } } return getXhr(); }

这样在这个函数在被第一次调用的时候,就会将getXhr确定下来,最后会返回对应那个分支的函数执行结果。

2.在程序第一次加载时确定function

var getXhr=(function(){ if("XMLHttpRequest" in window){ return function(){ return new XMLHttpRequest(); } }else if("ActiveXObject" in window) { if(arguments.callee.activeXStr!=="String"){ var versions=["MSXML2.XMLHttp.6.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp"], i,length; try{ for(i=0;lenth=versions.length;i++){ new ActiveXObject(versions[i]); arguments.callee.activeXStr=version[i]; break; } }catch(err){ } } return function(){ return new ActiveXObject(versions[i]); } }else{ return function(){ throw("No available XHR"); } } } })();

这是一个IIFE,这样写只会在第一次加载该代码片段的时候消耗点性能,之后getXhr也会被确定下来。

记录备忘!

转载请注明原文地址: https://www.6miu.com/read-78399.html

最新回复(0)