物件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
921 _.keys = function(obj) { if (!_.isObject(obj)) return []; if (nativeKeys) return nativeKeys(obj); var keys = []; for (var key in obj) if (_.has(obj, key)) keys.push(key); // Ahem, IE < 9. if (hasEnumBug) collectNonEnumProps(obj, keys); return keys; }; // Retrieve all the property names of an object. _.allKeys = function(obj) { if (!_.isObject(obj)) return []; var keys = []; for (var key in obj) keys.push(key); // Ahem, IE < 9. if (hasEnumBug) collectNonEnumProps(obj, keys); return keys; }; |
keys 和
allKeys 這兩個函式很有對比意義。
前者是該物件的列舉屬性,先用預設函式處理,再考慮迴圈遍歷,最後考慮老版本瀏覽器的時候返回預設屬性解決方案。
後者是該物件的列舉屬性以及繼承的屬性,直接進行深度遍歷,然後考慮老版本瀏覽器的時候直接返回預設屬性解決方案。
1 |
31 nativeKeys = Object.keys, |
Object 自帶的這個 keys 函式來判斷物件的列舉屬性很方便,不過也是ECMAScript5新增的函式。
1 2 3 |
1260 _.has = function(obj, key) { return obj != null && hasOwnProperty.call(obj, key); }; |
hasOwnProperty 函式可以有效的判斷列舉屬性。
函式
1 2 3 4 5 6 |
758 _.delay = function(func, wait) { var args = slice.call(arguments, 2); return setTimeout(function(){ return func.apply(null, args); }, wait); }; |
一個閉包的好例子,把引數快取起來供延遲函式載入。
1 2 3 4 5 6 7 |
870 _.after = function(times, func) { return function() { if (--times < 1) { return func.apply(this, arguments); } }; }; |
這個程式碼沒有太多新意,不過這個函式的使用方法很有意思。但用於多個非同步請求的時候非常有用。例如這個例子:
1 2 3 4 5 |
function render(){//...} var renderNotes = _.after(notes.length, render); _.each(notes, function(note) { note.asyncSave({success: renderNotes}); }); |
總結
underscore之所以經典,一方面它是一個JavaScript實用庫,提供了很多工具函式,可以有效地減少我們的程式碼量,尤其是在對陣列和物件的操作上;另一方面是其體現了JavaScript函數語言程式設計的特點,原始碼中隨處可見函式的巢狀。像函數語言程式設計的無狀態、高階程式設計這些特點和閉包都有著緊密的聯絡,所以下一階段希望能透過JavaScript閉包特性的學習一探函數語言程式設計的精妙。
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!
任選一種支付方式