code: function analyseExprDataHotspot(expr, accessorMeanDynamic) {
      var refs = [];
      var isDynamic;
  
      function analyseExprs(exprs, accessorMeanDynamic) {
          for (var i = 0, l = exprs.length; i < l; i++) {
              refs = refs.concat(analyseExprDataHotspot(exprs[i], accessorMeanDynamic));
              isDynamic = isDynamic || exprs[i].dynamic;
          }
      }
  
      switch (expr.type) {
          case ExprType.ACCESSOR:
              isDynamic = accessorMeanDynamic;
  
              var paths = expr.paths;
              refs.push(paths[0].value);
  
              if (paths.length > 1) {
                  refs.push(paths[0].value + '.' + (paths[1].value || '*'));
              }
  
              analyseExprs(paths.slice(1), 1);
              break;
  
          case ExprType.UNARY:
              refs = analyseExprDataHotspot(expr.expr, accessorMeanDynamic);
              isDynamic = expr.expr.dynamic;
              break;
  
          case ExprType.TEXT:
          case ExprType.BINARY:
          case ExprType.TERTIARY:
              analyseExprs(expr.segs, accessorMeanDynamic);
              break;
  
          case ExprType.INTERP:
              refs = analyseExprDataHotspot(expr.expr);
              isDynamic = expr.expr.dynamic;
  
              each(expr.filters, function (filter) {
                  analyseExprs(filter.name.paths);
                  analyseExprs(filter.args);
              });
  
              break;
  
          case ExprType.ARRAY:
          case ExprType.OBJECT:
              for (var i = 0; i < expr.items.length; i++) {
                  refs = refs.concat(analyseExprDataHotspot(expr.items[i].expr));
                  isDynamic = isDynamic || expr.items[i].expr.dynamic;
              }
              break;
      }
  
      isDynamic && (expr.dynamic = true);
      return refs;
  }
docs: 分析表达式的数据引用
  
  @param {Object} expr 要分析的表达式
  @return {Array}