這篇文章主要給大家匯總介紹了javascript最基本的7個函數,十分的實用,有需要的小伙伴可以參考下。
我記得早期的 JavaScript ,要完成任何事情幾乎都繞不開一些簡單的函數,因為浏覽器提供商實現功能有所差異,而且不只是邊緣功能,基礎功能也一樣,如 addEventListener 和 attachEvent。雖然時代變了,但仍有一些函數是每個開發者都應該掌握的,以便於完成某些功能和提高性能。
debounce
對於高耗能事件,debounce 函數是一種不錯解決方案。如果你不對 scroll、resize、和 key* 事件使用 debounce 函數,那麼你幾乎等同於犯了錯誤。下面的 debounce 函數能讓你的代碼保持高效:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // 返回一個函數,如果它被不間斷地調用,它將不會得到執行。該函數在停止調用 N 毫秒後,再次調用它才會得到執行。如果有傳遞 ‘immediate' 參數,會馬上將函數安排到執行隊列中,而不會延遲。 function debounce(func, wait, immediate) { var timeout; return function() { var context = this, args = arguments; var later = function() { timeout = null; if (!immediate) func.apply(context, args); }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) func.apply(context, args); }; }; // 用法 var myEfficientFn = debounce(function() { // 所有繁重的操作 }, 250); window.addEventListener('resize', myEfficientFn);debounce 函數不允許回調函數在指定時間內執行多於一次。當為一個會頻繁觸發的事件分配一個回調函數時,該函數顯得尤為重要。
poll
盡管上面我提及了 debounce 函數,但如果事件不存在時,你就不能插入一個事件以判斷所需的狀態,那麼就需要每隔一段時間去檢查狀態是否達到你的要求。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 function poll(fn, callback, errback, timeout, interval) { var endTime = Number(new Date()) + (timeout || 2000); interval = interval || 100; (function p() { // 如果條件滿足,則執行! if(fn()) { callback(); } // 如果條件不滿足,但並未超時,再來一次 else if (Number(new Date()) < endTime) { setTimeout(p, interval); } // 不匹配且時間消耗過長,則拒絕! else { errback(new Error('timed out for ' + fn + ': ' + arguments)); } })(); } // 用法:確保元素可見 poll( function() { return document.getElementById('lightbox').offsetWidth > 0; }, function() { // 執行,成功的回調函數 }, function() { // 錯誤,失敗的回調函數 } );Polling 在 web 中已被應用很長時間了,並在將來仍會被使用。
once
有時候,你想讓一個給定的功能只發生一次,類似於 onload 事件。下面的代碼提供了你所說的功能:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 function once(fn, context) { var result; return function() { if(fn) { result = fn.apply(context || this, arguments); fn = null; } return result; }; } // 用法 var canOnlyFireOnce = once(function() { console.log('Fired!'); }); canOnlyFireOnce(); // "Fired!" canOnlyFireOnce(); // nada // 沒有執行指定函數once 函數確保給定函數只能被調用一次,從而防止重復初始化!
getAbsoluteUrl
從一個字符串變量得到一個絕對 URL,並不是你想象中這麼簡單。對於某些 URL 構造器,如果你不提供必要的參數就會出問題(而有時候你真的不知道提供什麼參數)。下面有一個優雅的技巧,只需要你傳遞一個字符串就能得到相應的絕對 URL。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 var getAbsoluteUrl = (function() { var a; return function(url) { if(!a) a = document.createElement('a'); a.href = url; return a.href; }; })(); // 用法 getAbsoluteUrl('/something'); // http://davidwalsh.name/somethinga 元素的 href 處理和 url 處理看似無意義,而 return 語句返回了一個可靠的絕對 URL。
isNative
如果你想知道一個指定函數是否是原生的,或者能不能通過聲明來覆蓋它。下面這段便於使用的代碼能給你答案:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 ;(function() { // 用於處理傳入參數 value 的內部 `[[Class]]` var toString = Object.prototype.toString;