惰性函数
惰性载入表示函数执行的分支只会在函数第一次掉用的时候执行,在第一次调用过程中,该函数会被覆盖为另一个按照合适方式执行的函数,这样任何对原函数的调用就不用再经过执行的分支了。
惰性函数相当于有记忆的功能一样,当它已经判断了一遍的话,第二遍就不会再判断了。
案例
- 现在要求写一个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()); //1627462278021
console.log(test()); //1627462278021
setTimeout(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'));