zoukankan      html  css  js  c++  java
  • JS对象类型函数进阶篇惰性函数

    惰性函数和普通函数的区别是它的执行分支只在函数调用时执行一次,调用过程中函数会被另一种合适的执行方式覆盖,所以后面再调用这个函数时,就不会再执行分支语句。

    使用场景

    为了兼容各大浏览器,经常会在函数内部写大量if语句来检侧浏览器特性。比如为dom节点添加事件函数。

    function addEvent(type, element, fn) {
      if(element.addEventListener) {
       element.addEventListener(type, fn, false)
      }
      else if(element.attachEvent){
        element.attachEvent('on' + type, fn);
      }
      else{
        element['on' + type] = fn;
      }
    }
    

    上面的函数会在每次执行点击事件时,都进行浏览器能力检侧,理论上只要检测一次就知道支持哪个方法了,后面的点击事件不需要再执行一遍判断,下面改写一下。

    惰性函数

    在使用惰性函数重写上面的addEvent之前,先了解一下函数的重写:

    function foo(){
      console.log(1)
      foo = function() {
       console.log(2)
      }
    }
    

    当第一次调用foo函数时,会打印1,然后函数会被覆盖掉。当第二次及以后调用时,会打印2。这就实现了函数的重写。

    【addEvent()重写】

    function addEvent(type, element, fn) {
      if(element.addEventListener) {
      addEvent = function(type, element, fn) {
        element.addEventListener(type, fn, false)
      }
      }
      else if(element.attachEvent){
       addEvent = function(type, element, fn) {
        element.attachEvent('on' + type, fn);
      }
      }
      else{
        addEvent = function(type, element, fn) {
        element['on' + type] = fn;
      }
      }
      return addEvent(type, element, fn);
    }
    

    当第一次调用addEvent函数时,会执行分支判断,新的函数覆盖掉原来的addEvent,以后再调用时执行的就是覆盖后的函数。

    上面的函数有一个小问题,如果addEvent函数名称变化,内部的函数名要一起修改,这就比较麻烦。下面改写一下addEvent,把嗅探浏览器的操作函数提前执行,并返回一个包含了正确逻辑的函数。

    var addEvent = (function () {
        if (document.addEventListener) {
            return function (type, element, fn) {
                element.addEventListener(type, fn, false);
            }
        }
        else if (document.attachEvent) {
            return function (type, element, fn) {
                element.attachEvent('on' + type, fn);
            }
        }
        else {
            return function (type, element, fn) {
                element['on' + type] = fn;
            }
        }
    })();
    
    优秀文章首发于聚享小站,欢迎关注!
  • 相关阅读:
    loadrunner中变量和参数之间的转化实例
    Web Tours自带示例网站无法打开的解决方案
    LoadRunner替换字符串(可以同时替换多个)
    strcmp函数使用总结
    MVC生成CheckBoxList并对其验证
    MEF(Managed Extensibility Framework)有选择性地使用扩展组件
    MEF(Managed Extensibility Framework)使用全部扩展组件
    委托、多播委托、泛型委托Func,Action,Predicate,ExpressionTree
    使用jQuery异步传递Model到控制器方法,并异步返回错误信息
    使用jQuery异步传递含复杂属性及集合属性的Model到控制器方法
  • 原文地址:https://www.cnblogs.com/yesyes/p/15351921.html
Copyright © 2011-2022 走看看