throttle
function throttle(fn, threshhold) {var last, timerId;threshhold || (threshhold = 250);return function() {var now = Date.now();if(last && now - last < threshhold) {clearTimeout(timerId);timerId = setTimeout(() => {fn.apply(this, arguments);}, threshhold)} else {last = now;fn.apply(this, arguments);}}}
debonce
去抖 连续触发
function debounce(fn, interval) {var timerId = null;return function() {clearTimeout(timerId);timerId = setTimeout(() => {fn.apply(this, arguments)}, interval)}}
call apply bind
简单版本
var foo = {value: 1,bar: function() {console.log(this.value)}}foo.bar() // 1
进阶
// 修改 prototype 版本Function.prototype.call2 = function(content = window, ...args) {content.fn = this;let result = content.fn(...args);delect content.fn;return result;}// 函数版本function call2 (context = window, fn) {context.fn = fn;let args = [...arguments].slice(2);let result = context.fn(...args);delete context.fn;return result;}// apply 第2个参数是数组Function.prototype.apply2 = function(content = window, args) {content.fn = this;let result = content.fn(...args);delect content.fn;return result;}
// bindFuntion.prototype.bind = function(obj) {if(type of this !== 'function') {return;}var _self = this;var args = [].slice.call(arguments, 1);return function() {return _self.apply(obj, args.concat([].slice.call(arguments)))}}
斐波那契
// R1let fib = (function() {let memory = []return function(n) {if(memory[n] !== undefined) {return memory[n]}return memory[n] = (n === 0 || n === 1) ? n : fibonacci(n-1) + fibonacci(n-2)}})()// R2function fib(n) {if(n === 0 || n === 1) return n;return fib(n - 2) + fib(n - 1);}
继承
function Dog(color) {Animal.apply(this, arguments);this.name = 'dog';}/* 注意下面两行 */Dog.prototype = Object.create(Animal.prototype);Dog.prototype.constructor = Dog;
柯里化
function currying(fn) {const argArr = [];let closure = function(...args) {if(args.length > 0) {argArr = [...argArr, ...args];return closure;}return fn(...argArr);}return closure;}
new
function newOps (ctor) {if(typeof ctor !== 'function') {throw new Error('the first param must be a function');}const new0bj = Object.create(ctor.prototype);const args = [].slice.call(arguments, 1);const ctorReturnResult = ctor.apply(newObj, args);if((typeof ctorReturnResult === 'object' && typeof ctorReturnResult !== null) || typeof ctorReturnResult === 'function') {return ctorReturnResult;}return newObj;}
