闭包和重写函数 返回IE浏览器版本号
开发过程中我们有时候需要知道IE的版本号,我们知道得到IE的版本号的方法:
1 var v = 3, 2 div = document.createElement('div'), 3 all = div.getElementsByTagName('i'); 4 while ( 5 div.innerHTML = '<!--[if gt ie ' + (++v) + ']><i></i><![endif]-->', 6 all[0] 7 ); 8 v = v > 4 ? v : false;
我们把它写成一个函数:
1 function getIEVersion(){ 2 var v = 3, 3 div = document.createElement('div'), 4 all = div.getElementsByTagName('i'); 5 while ( 6 div.innerHTML = '<!--[if gt ie ' + (++v) + ']><i></i><![endif]-->', 7 all[0] 8 ); 9 v = v > 4 ? v : false; 10 11 return v; 12 }
总不能每次获取IE版本都执行函数里的代码,所以,我们可以直接获取浏览器的版本号:
1 var _IEVersion = (function(){ 2 var v = 3, 3 div = document.createElement('div'), 4 all = div.getElementsByTagName('i'); 5 while ( 6 div.innerHTML = '<!--[if gt ie ' + (++v) + ']><i></i><![endif]-->', 7 all[0] 8 ); 9 v = v > 4 ? v : false; 10 11 return v; 12 })();
这样,每次代码都默认执行一次获取IE浏览器的版本号了,即使我们没有必要使用变量_IEVersion。所以我们想只有在需要获取版本号时再执行代码,因此:
1 function getIEVersion() { 2 var v = 3, 3 div = document.createElement('div'), 4 all = div.getElementsByTagName('i'); 5 while ( 6 div.innerHTML = '<!--[if gt ie ' + (++v) + ']><i></i><![endif]-->', 7 all[0] 8 ); 9 v = v > 4 ? v : false; 10 11 this.getIEVersion = function(){return v} 12 13 return v; 14 }
以上的实现方式只有在第一次调用的时候执行获取版本号,以后获取的话就直接返回上次执行的结果值。以上方法是在第一次执行后修改了getIEVersion函数,形成闭包,以后调用的话直接返回值。其中的以上代码中的第11行中的写法本来可以用arguments.callee的,但在新的标准中废除了不建议使用,主要是性能比较低,参考。
另外一种实现方式,直接形成闭包,返回函数:
1 var getIEVersion = (function(){ 2 3 var _v = undefined 4 ,isInit = false; 5 6 return function() { 7 if(isInit){ 8 return _v; 9 }else{ 10 var v = 3, 11 div = document.createElement('div'), 12 all = div.getElementsByTagName('i'); 13 while ( 14 div.innerHTML = '<!--[if gt ie ' + (++v) + ']><i></i><![endif]-->', 15 all[0] 16 ); 17 isInit = true; 18 return _v = (v > 4 ? v : false); 19 } 20 } 21 22 })();
最后这两种方法的实现有各自的优缺点,使用场景上,我感觉倒二种方法用于当做公共的全局方法,最后一种实现方式适合用于公共方法对象的某个属性方法。