code: function genTraversalHandler(fn) {
    var setter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (target, key, value) {
      target[key] = value;
    };
  
    // use recursive to move what in source to the target
    // if you do not provide a target, we will create a new target
    function recursiveFn(source, target, key) {
      if (isArray(source) || isObject(source)) {
        target = isPrimitive(target) ? isObject(source) ? {} : [] : target;
        for (var _key in source) {
          // $FlowFixMe: support computed key here
          setter(target, _key, recursiveFn(source[_key], target[_key], _key));
          // target[key] = recursiveFn(source[key], target[key], key);
        }
        return target;
      }
      return fn(source, target, key);
    }
    return recursiveFn;
  }
docs: the handler to generate an deep traversal handler
  @param  {Function} fn the function you wanna run when you reach in the deep property
  @return {Function}    the handler