惰性函数
惰性载入表示函数执行的分支只会在函数第一次掉用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了。
惰性函数相当于有记忆的功能一样,当它已经判断了一遍的话,第二遍就不会再判断了。
案例
- 现在要求写一个test函数,这个函数返回首次调用时的new Date().getTime(),注意是首次,而且不允许有全局变量的污染
//一般会这样实现var test = (function () {var t = null;return function () {if (t) {return t;}t = new Date().getTime();return t;}})();console.log(test()); //1627462278021console.log(test()); //1627462278021setTimeout(function () {console.log(test()); //1627462278021}, 2000)
用惰性函数实现就是:
var test = function () {var t = new Date().getTime();test = function () {return t;}return test();}console.log(test());console.log(test());console.log(test());console.log(test());
- 函数重构「闭包」判断环境只需要判断一次(函数库封装时判断环境)
- 分析怎么懒:每次都要判断是否兼容,实际上只要判断一次,后面都不用了
- 实现:函数重新赋值
- 原理:function 被全局作用域下的getCss占用,形成闭包
// 惰性思想:懒,能够只执行一遍的,绝对不会执行第二遍「性能优化」// + getComputedStyle([Element])[ATTR] 获取当前元素所有经过浏览器计算的样式// + [Element].currentStyle[ATTR] IE6~8// 弊端:第一次执行,需要校验一下兼容性;但是后续每一次执行,都需要重新校验 “这个操作是多余的”.../* let getCss = function getCss(ele, attr) {if ('getComputedStyle' in window) {return window.getComputedStyle(ele)[attr];}return ele.currentStyle[attr];};console.log(getCss(box, 'width'));console.log(getCss(box, 'padding'));console.log(getCss(box, 'display')); */// 核心:函数重构「闭包」// 1. 不能用const, 因为后面要修改// 2. 匿名函数具名化这里不能用,因为不能修改let getCss = function (ele, attr) {// 根据是否兼容重新赋值,后面就不用判断了(懒)if ('getComputedStyle' in window) {getCss = function (ele, attr) {return window.getComputedStyle(ele)[attr];};} else {getCss = function (ele, attr) {return ele.currentStyle[attr];};}// 保证第一次也获取值return getCss(ele, attr);};console.log(getCss(box, 'width'));console.log(getCss(box, 'padding'));console.log(getCss(box, 'display'));
