惰性函数

举例一个函数多次求值的写法,

函数内部改变自身的一种机制,函数内部重新写入这个函数;第一步获取时间值运行一次;

var getTimeStamp = function(){
   var timeStamp = new Date().getTime()
     getTimeStamp = function(){
       return timeStamp
   }
   return timeStamp
} 
getTimeStamp()
getTimeStamp()

// 改写

 
var getTimeStamp = function(){
   var timeStamp = new Date().getTime()
     getTimeStamp = function(){
       return timeStamp
   }
   return timeStamp() // 这里直接调用
} 

 官方定义:

函数执行的分支只会在第一次调用的时候执行,

在第一次调用的过程中,该函数被覆盖为另一个按照合适方式执行的函数

这样,任何对原函数的调用就不用经过该分支了;

 

使用场景:

例如事件兼容性

不能使用惰性函数

var addEvent = (function (el, type, fn, capture) {
  if (window.addEventListener) {
    return function (type, fn, capture) {
      el.addEventListener(type, fn, capture)
    }
  } else if (window.attachEvent) {
    return function (type, fn, capture) {
      el.attachEvent('on' + type, function () {
        fn.call(el)
      })
    }
  } else {
    return function (el, type, fn) {
      el['on' + type] = fn
    }
  }
})()

使用惰性函数

var addEvent = function (el, type, fn, capture) {
  if (el.addEventListener) {
    addEvent = function (el, type, fn, capture) {
      el.addEventListener(type, fn, capture)
    }
  } else if (el.attachEvent) {
    addEvent = function (el, type, fn) {
      el.attachEvent('on' + type, function () {
        fn.call(el)
      })
    }
  } else {
    addEvent = function (el, type, fn) {
      el['on' + type] = fn
    }
  }
  addEvent(el, type, fn, capture)
}

执行的时候会改变自身,执行1之后不会改变,如下例子

    function test (num) {
      switch (num) {
        case 1:
          test = function () {
            console.log('黑弗雷')
          }
          break;
        case 2:
          test = function () {
            console.log('i love u')
          }
          break;
        case 3:
          test = function () {
            console.log('我爱你')
          }
          break;

      }
      return test() // 最后异步返回执行这个函数
    }

    // test(1)
    test(2)

 

posted @ 2022-08-13 15:04  大桥默默学  阅读(36)  评论(0编辑  收藏  举报