闭包和重写函数 返回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 })();

 

最后这两种方法的实现有各自的优缺点,使用场景上,我感觉倒二种方法用于当做公共的全局方法,最后一种实现方式适合用于公共方法对象的某个属性方法。

posted @ 2015-12-17 18:05  z s k  阅读(691)  评论(0编辑  收藏  举报