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

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

  • 相关阅读:
    机器人搬重物(BFS)
    POJ1386Play on Words(欧拉回路)
    轰炸
    杂务(动态规划)
    Prism框架的Regions使用
    MVVM(使用Prism框架)开发WPF
    WPF显示数据库内容
    UI案例
    VS的快捷操作
    谷歌浏览器插件安装、VIP看视频、解除百度网盘限速
  • 原文地址:https://www.cnblogs.com/zsk526/p/5054896.html
Copyright © 2020-2023  润新知