# 惰性函数
## 函数重写
一个函数执行之后, 被另一个函数覆盖了。 其实就是你之前函数指针, 指向了另一个新函数.
```
function fun_a(){
console.log('fun_a');
fun_a = function(){
console.log("fun_b");
}
}
fun_a(); // fun_a, 并且让fun_a指向新函数
fun_a(); // fun_b
```
## 看例子
```
function addEvent(type, element, fun) {
if (element.addEventListener) {
element.addEventListener(type, fun, false);
}
else if(element.attachEvent){
element.attachEvent('on' + type, fun);
}
else{
element['on' + type] = fun;
}
}
```
每次给浏览添加事件的时候,都会做判断。 其实,我们在第一次用addEvent函数的时候,就已经可以确定浏览器了,之后所有调用addEvent都会做同样的判断,走同样的分支。在上面我们已经知道了 函数重写了, 那么我们在一次做出判断之后,重写 addEvent 函数,这样以后调用的时候就不需要判断了。
改写成如下形式: 利用到了立即执行函数,在函数加载的时候就做出了判断,返回确定函数
```
var addEvent = (function () {
if (document.addEventListener) {
return function (type, element, fun) {
element.addEventListener(type, fun, false);
}
}
else if (document.attachEvent) {
return function (type, element, fun) {
element.attachEvent('on' + type, fun);
}
}
else {
return function (type, element, fun) {
element['on' + type] = fun;
}
}
})();
```
### 惰性函数
惰性函数的本质是函数重写。
惰性函数, 是指在执行之后才能确定函数本身,不是确定在定义时。
### 适用场景
1. 应用频繁,如果只用一次,是体现不出它的优点出来的,用的次数越多,越能体现这种模式的优势所在;
2. 分支判断,调用的所有结果都会走同样的分支。
适用浏览器的兼容性。