SOURCE

function normalizeMap (map) {
  // 判断是否数组,并且最终返回也是一个数组
  console.log(1)
  console.log(Object.keys(map))
  
  return Array.isArray(map)
    // 是数组就直接 map 循环
    ? map.map(key => ({ key, val: key }))
    // 是对象就将 key拿出来,然后再进行 map 循环
    : Object.keys(map).map(key => ({ key, val: map[key] }))
}

var mapState = function (states) {
  var res = {}; // 这是一个对象类型
  // 将 state 通过normalizeMap格式化变成一个数组,数组元素是一个对象
  // console.log(states);
  // console.log(normalizeMap(states));
  normalizeMap(states).forEach(function (ref) {
    var key = ref.key;// 将数组元素对象解出来,先保存起来被后面使用
    var val = ref.val;
    // 组成一个新数组,以 key 为 key,值是一个函数mappedState
    res[key] = function mappedState () {
      var state = this.$store.state; // 将本身 vuex 的 store 的 state 和 getters 保存
      var getters = this.$store.getters;
      // 先不看 namespace 部分
      //if (namespace) {
      //  var module = getModuleByNamespace(this.$store, 'mapState', namespace);
      //  if (!module) {
      //    return
      //  }
      //   state = module.context.state;
      //  getters = module.context.getters;
      //}
      // 这个函数里面会判断真正的值 ref.val 是函数还是普通值
      return typeof val === 'function'
        ? val.call(this, state, getters) // 函数会被直接执行,并且传入 vuex 的state 和 getters
        : state[val] // 值会直接放到  vuex 的state 里面
    };
    // mark vuex getter for devtools
    res[key].vuex = true;
  });
  return res
};

var testFun = function(){
  console.log(1);
}


mapState(testFun)
console.log("end")
console 命令行工具 X clear

                    
>
console