節流
當一個函數需要頻繁的被調用時,會消耗大量的資源,使用節流的方式會減少資源的消耗
即在規定時間內只讓函數觸發的第一次生效,后面不生效。
//fn為需要執行的函數,dalay為需要延遲的時間 function throttle(fn,delay){ //記錄上一次函數觸發的時間 var lastTime = 0; //使用閉包能防止讓lastTime的值在每次調用時都初始化為0 return function(){ var nowTime = Data.now(); if(nowTime-lastTime > delay){ //修正this的指向問題 fn.call(this); //將時間同步 lastTime = nowTime; } } }
防抖
一個需要頻繁觸發的函數需要在規定時間內,只讓最后一次生效,前面的不生效
function debounce(fn,delay){ //記錄上一次的延時器 var timer = null //第一次設置為空 return function(){ //使用閉包防止每次調用時將timer初始化為null; clearTimeout(timer) //清除上一次的延時器 //重新設置新的延時器 timer = setTimeout(function(){ //設置延時器 fn.apply(this); //修正fn函數的this指向 },delay) } }
關於函數的call()和apply()方法
call和apply都是Function對象的原型方法,它們是把特定的函數當作一個方法綁定到指定的對象上進行調用。
apply和call的方法和功能用法相同,區別是他們傳遞的參數的方式不同,其中apply()是用數組的方式進行傳遞參數,call方法則用數值的方式進行傳遞參數。
而且call()方法只能接受多個參數列表,apply()方法只能接收數組或者偽類數組,數組元素將作為參數傳遞給被調用的函數。