<!DOCTYPE html><html><head><meta charset="utf-8"><title>函数节流 Function throttling</title></head>
<body>函数节流 Function throttling ......<script>
//函数节流
let throttle= function(fnToBeExecuted,delay){
let timer;
let firstTime = true;
return function(){
let closureThis = this;
let closureArgs = arguments;
if(timer){
return false;
}
if(firstTime){
fnToBeExecuted.apply(closureThis,closureArgs);
firstTime = false;
}
timer = setTimeout(function(){
clearTimeout(timer);
timer = null;
fnToBeExecuted.apply(closureThis,closureArgs);
},(delay || 500));
}
}
window.onresize = throttle(function(){console.log('throttle')},3000);
</script></body></html>
// 通用的单例模式
let getSingleton = function(fn)(){
let instance;
return function(){
return instance || (instance = fn.apply(this,arguments));
}
};
getSingleton(function(){//createSomethingThenReturn})
// AOP
Function.prototype.before = function (beforefn) {
var _self = this;
//闭包
return function(){
// beforefn 和 _self 原来怎么调用的, 返回闭包后还是按照原来的方式调用
// 因此 this 就是调用 beforefn 和 _self 的那个 this
beforefn.apply(this,arguments);
_self.apply(this,arguments)
}
}
Function.prototype.after = function (afterfn) {
var _self = this;
return function () {
_self.apply(this,arguments);
afterfn.apply(this,arguments);
}
}