code: function (options, cb, context) {
          if (typeof options === 'function') {
              context = cb;
              cb = options;
              options = null;
          }
  
          options = options || {};
          if (zrUtil.isString(options)) {
              options = {order: options};
          }
  
          var order = options.order || 'preorder';
          var children = this[options.attr || 'children'];
  
          var suppressVisitSub;
          order === 'preorder' && (suppressVisitSub = cb.call(context, this));
  
          for (var i = 0; !suppressVisitSub && i < children.length; i++) {
              children[i].eachNode(options, cb, context);
          }
  
          order === 'postorder' && cb.call(context, this);
      }
docs: Travel this subtree (include this node).
  Usage:
  node.eachNode(function () { ... }); // preorder
  node.eachNode('preorder', function () { ... }); // preorder
  node.eachNode('postorder', function () { ... }); // postorder
  node.eachNode(
  {order: 'postorder', attr: 'viewChildren'},
  function () { ... }
  ); // postorder
  
  @param {(Object|string)} options If string, means order.
  @param {string=} options.order 'preorder' or 'postorder'
  @param {string=} options.attr 'children' or 'viewChildren'
  @param {Function} cb If in preorder and return false,
  its subtree will not be visited.
  @param {Object} [context]