定义一个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对象中查找是否有缓存的值,如果有直接返回,如果没有则执行处理函数并保存到缓存中;

hyphenate 函数可以理解为:
var hyphenate = function(str){
    // cache会作为该函数的一个闭包对象存在其内部作用域中(继承其父函数cached的作用域)
    var hit = cache[str];
    if(hit){
        return hit
    }else{
        return (cache[str] = str.replace(hyphenateRE, '-$1').toLowerCase())
    }
}