定義一個cached函數做爲存儲變量的中間體:緩存
function cached(fn){ var cache = Object.create(null); return function(str){ var hit = cache[str]; return hit || (cache[str] = fn(str)) } }
在cached函數中,定義了一個cache的內部變量,該變量只能在其內部,或者其子函數內部被訪問。閉包
var hyphenateRE = /\B([A-Z])/g; var hyphenate = cached(function (str) { return str.replace(hyphenateRE, '-$1').toLowerCase() });
而後定義一個駝峯轉鏈接符的方法:函數
在咱們調用 hyphenate 方法的時候,會首先在其cache對象中查找是否有緩存的值,若是有直接返回,若是沒有則執行處理函數並保存到緩存中;spa
hyphenate 函數能夠理解爲:
var hyphenate = function(str){ // cache會做爲該函數的一個閉包對象存在其內部做用域中(繼承其父函數cached的做用域) var hit = cache[str]; if(hit){ return hit }else{ return (cache[str] = str.replace(hyphenateRE, '-$1').toLowerCase()) } }