You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by su...@apache.org on 2020/03/26 19:44:12 UTC

[incubator-echarts] 02/02: ts: let to const. And add eslint rule "prefer-const".

This is an automated email from the ASF dual-hosted git repository.

sushuang pushed a commit to branch next
in repository https://gitbox.apache.org/repos/asf/incubator-echarts.git

commit c7055cebf7f75f038702af5a312132698b071581
Author: 100pah <su...@gmail.com>
AuthorDate: Fri Mar 27 03:43:14 2020 +0800

    ts: let to const. And add eslint rule "prefer-const".
---
 extension-src/.eslintrc.yaml                      |   4 +
 extension-src/bmap/BMapCoordSys.ts                |  36 +-
 extension-src/bmap/BMapModel.ts                   |   2 +-
 extension-src/bmap/BMapView.ts                    |  26 +-
 extension-src/bmap/bmap.ts                        |   6 +-
 extension-src/dataTool/gexf.ts                    |  50 +--
 extension-src/dataTool/index.ts                   |   2 +-
 extension-src/dataTool/prepareBoxplotData.ts      |  32 +-
 src/.eslintrc.yaml                                |   4 +
 src/CoordinateSystem.ts                           |   2 +-
 src/action/createDataSelectAction.ts              |   6 +-
 src/action/geoRoam.ts                             |   6 +-
 src/action/roamHelper.ts                          |  16 +-
 src/chart/bar/BarSeries.ts                        |   2 +-
 src/chart/bar/BarView.ts                          | 188 +++++-----
 src/chart/bar/BaseBarSeries.ts                    |  12 +-
 src/chart/bar/PictorialBarView.ts                 | 180 +++++-----
 src/chart/bar/barItemStyle.ts                     |   4 +-
 src/chart/boxplot/BoxplotView.ts                  |  40 +--
 src/chart/boxplot/boxplotLayout.ts                |  70 ++--
 src/chart/boxplot/boxplotVisual.ts                |   8 +-
 src/chart/candlestick/CandlestickSeries.ts        |   2 +-
 src/chart/candlestick/CandlestickView.ts          |  72 ++--
 src/chart/candlestick/candlestickLayout.ts        |  84 ++---
 src/chart/candlestick/candlestickVisual.ts        |   8 +-
 src/chart/custom.ts                               | 108 +++---
 src/chart/effectScatter/EffectScatterView.ts      |  10 +-
 src/chart/funnel/FunnelSeries.ts                  |  12 +-
 src/chart/funnel/FunnelView.ts                    |  60 ++--
 src/chart/funnel/funnelLayout.ts                  |  56 +--
 src/chart/gauge/GaugeView.ts                      | 150 ++++----
 src/chart/gauge/PointerPath.ts                    |  12 +-
 src/chart/graph/GraphSeries.ts                    |  38 +-
 src/chart/graph/GraphView.ts                      |  90 ++---
 src/chart/graph/adjustEdge.ts                     |  46 +--
 src/chart/graph/categoryFilter.ts                 |  12 +-
 src/chart/graph/categoryVisual.ts                 |  24 +-
 src/chart/graph/circularLayoutHelper.ts           |  38 +-
 src/chart/graph/createView.ts                     |  26 +-
 src/chart/graph/edgeVisual.ts                     |  22 +-
 src/chart/graph/forceHelper.ts                    |  42 +--
 src/chart/graph/forceLayout.ts                    |  46 +--
 src/chart/graph/graphAction.ts                    |   4 +-
 src/chart/graph/graphHelper.ts                    |  12 +-
 src/chart/graph/simpleLayout.ts                   |  10 +-
 src/chart/graph/simpleLayoutHelper.ts             |  14 +-
 src/chart/heatmap/HeatmapLayer.ts                 |  58 +--
 src/chart/heatmap/HeatmapSeries.ts                |   2 +-
 src/chart/heatmap/HeatmapView.ts                  |  72 ++--
 src/chart/helper/EffectLine.ts                    |  48 +--
 src/chart/helper/EffectPolyline.ts                |  22 +-
 src/chart/helper/EffectSymbol.ts                  |  48 +--
 src/chart/helper/LargeLineDraw.ts                 |  62 ++--
 src/chart/helper/LargeSymbolDraw.ts               |  64 ++--
 src/chart/helper/Line.ts                          |  98 ++---
 src/chart/helper/LineDraw.ts                      |  20 +-
 src/chart/helper/LinePath.ts                      |   4 +-
 src/chart/helper/Polyline.ts                      |  18 +-
 src/chart/helper/Symbol.ts                        |  50 +--
 src/chart/helper/SymbolDraw.ts                    |  32 +-
 src/chart/helper/createClipPathFromCoordSys.ts    |  12 +-
 src/chart/helper/createGraphFromNodeEdge.ts       |  22 +-
 src/chart/helper/createListFromArray.ts           |  26 +-
 src/chart/helper/createListSimply.ts              |   6 +-
 src/chart/helper/createRenderPlanner.ts           |  14 +-
 src/chart/helper/labelHelper.ts                   |   8 +-
 src/chart/helper/treeHelper.ts                    |  12 +-
 src/chart/helper/whiskerBoxCommon.ts              |  32 +-
 src/chart/line/LineSeries.ts                      |   2 +-
 src/chart/line/LineView.ts                        | 150 ++++----
 src/chart/line/helper.ts                          |  26 +-
 src/chart/line/lineAnimationDiff.ts               |  44 +--
 src/chart/line/poly.ts                            |  36 +-
 src/chart/lines/LinesSeries.ts                    |  56 +--
 src/chart/lines/LinesView.ts                      |  36 +-
 src/chart/lines/linesLayout.ts                    |  20 +-
 src/chart/lines/linesVisual.ts                    |  14 +-
 src/chart/map/MapSeries.ts                        |  42 +--
 src/chart/map/MapView.ts                          |  38 +-
 src/chart/map/backwardCompat.ts                   |   2 +-
 src/chart/map/mapDataStatistic.ts                 |  16 +-
 src/chart/map/mapSymbolLayout.ts                  |  24 +-
 src/chart/map/mapVisual.ts                        |   8 +-
 src/chart/parallel/ParallelSeries.ts              |  14 +-
 src/chart/parallel/ParallelView.ts                |  56 +--
 src/chart/parallel/parallelVisual.ts              |  20 +-
 src/chart/pie/PieSeries.ts                        |  16 +-
 src/chart/pie/PieView.ts                          | 102 +++---
 src/chart/pie/labelLayout.ts                      |  80 ++---
 src/chart/pie/pieLayout.ts                        |  46 +--
 src/chart/radar/RadarSeries.ts                    |  18 +-
 src/chart/radar/RadarView.ts                      |  64 ++--
 src/chart/radar/backwardCompat.ts                 |   2 +-
 src/chart/radar/radarLayout.ts                    |  12 +-
 src/chart/sankey/SankeySeries.ts                  |  46 +--
 src/chart/sankey/SankeyView.ts                    |  74 ++--
 src/chart/sankey/sankeyLayout.ts                  | 104 +++---
 src/chart/sankey/sankeyVisual.ts                  |  12 +-
 src/chart/scatter/ScatterSeries.ts                |   4 +-
 src/chart/scatter/ScatterView.ts                  |  20 +-
 src/chart/sunburst/SunburstPiece.ts               |  76 ++--
 src/chart/sunburst/SunburstSeries.ts              |  12 +-
 src/chart/sunburst/SunburstView.ts                |  44 +--
 src/chart/sunburst/sunburstAction.ts              |   6 +-
 src/chart/sunburst/sunburstLayout.ts              |  68 ++--
 src/chart/themeRiver/ThemeRiverSeries.ts          |  62 ++--
 src/chart/themeRiver/ThemeRiverView.ts            |  46 +--
 src/chart/themeRiver/themeRiverLayout.ts          |  48 +--
 src/chart/themeRiver/themeRiverVisual.ts          |  14 +-
 src/chart/tree/TreeSeries.ts                      |  22 +-
 src/chart/tree/TreeView.ts                        | 148 ++++----
 src/chart/tree/layoutHelper.ts                    |  28 +-
 src/chart/tree/traversalHelper.ts                 |  10 +-
 src/chart/tree/treeAction.ts                      |  10 +-
 src/chart/tree/treeLayout.ts                      |  18 +-
 src/chart/treemap/Breadcrumb.ts                   |  32 +-
 src/chart/treemap/TreemapSeries.ts                |  26 +-
 src/chart/treemap/TreemapView.ts                  | 176 ++++-----
 src/chart/treemap/treemapAction.ts                |   6 +-
 src/chart/treemap/treemapLayout.ts                | 142 ++++----
 src/chart/treemap/treemapVisual.ts                |  58 +--
 src/component/axis/AngleAxisView.ts               | 100 +++---
 src/component/axis/AxisBuilder.ts                 | 170 ++++-----
 src/component/axis/AxisView.ts                    |   6 +-
 src/component/axis/CartesianAxisView.ts           |  52 +--
 src/component/axis/ParallelAxisView.ts            |  38 +-
 src/component/axis/RadiusAxisView.ts              |  42 +--
 src/component/axis/SingleAxisView.ts              |  32 +-
 src/component/axis/axisSplitHelper.ts             |  24 +-
 src/component/axisPointer.ts                      |   2 +-
 src/component/axisPointer/AxisPointerView.ts      |   4 +-
 src/component/axisPointer/BaseAxisPointer.ts      |  70 ++--
 src/component/axisPointer/CartesianAxisPointer.ts |  44 +--
 src/component/axisPointer/PolarAxisPointer.ts     |  43 ++-
 src/component/axisPointer/SingleAxisPointer.ts    |  42 +--
 src/component/axisPointer/axisTrigger.ts          | 102 +++---
 src/component/axisPointer/findPointFromSeries.ts  |  12 +-
 src/component/axisPointer/globalListener.ts       |  20 +-
 src/component/axisPointer/modelHelper.ts          |  78 ++--
 src/component/axisPointer/viewHelper.ts           |  44 +--
 src/component/brush/BrushModel.ts                 |   4 +-
 src/component/brush/BrushView.ts                  |   4 +-
 src/component/brush/preprocessor.ts               |  10 +-
 src/component/brush/selector.ts                   |  28 +-
 src/component/brush/visualEncoding.ts             |  52 +--
 src/component/calendar/CalendarView.ts            | 120 +++----
 src/component/dataZoom/AxisProxy.ts               |  86 ++---
 src/component/dataZoom/DataZoomModel.ts           |  80 ++---
 src/component/dataZoom/DataZoomView.ts            |  10 +-
 src/component/dataZoom/InsideZoomView.ts          |  52 +--
 src/component/dataZoom/SliderZoomView.ts          | 196 +++++-----
 src/component/dataZoom/dataZoomAction.ts          |   4 +-
 src/component/dataZoom/dataZoomProcessor.ts       |  10 +-
 src/component/dataZoom/helper.ts                  |   6 +-
 src/component/dataZoom/history.ts                 |  16 +-
 src/component/dataZoom/roams.ts                   |  30 +-
 src/component/geo.ts                              |   4 +-
 src/component/geo/GeoView.ts                      |   4 +-
 src/component/graphic.ts                          |  92 ++---
 src/component/helper/BrushController.ts           | 200 +++++------
 src/component/helper/BrushTargetManager.ts        |  82 ++---
 src/component/helper/MapDraw.ts                   |  88 ++---
 src/component/helper/RoamController.ts            |  40 +--
 src/component/helper/brushHelper.ts               |   8 +-
 src/component/helper/cursorHelper.ts              |   4 +-
 src/component/helper/interactionMutex.ts          |   6 +-
 src/component/helper/listComponent.ts             |  12 +-
 src/component/helper/roamHelper.ts                |  18 +-
 src/component/helper/selectableMixin.ts           |  10 +-
 src/component/helper/sliderMove.ts                |  10 +-
 src/component/legend/LegendModel.ts               |  34 +-
 src/component/legend/LegendView.ts                | 126 +++----
 src/component/legend/ScrollableLegendModel.ts     |   6 +-
 src/component/legend/ScrollableLegendView.ts      | 120 +++----
 src/component/legend/legendAction.ts              |  10 +-
 src/component/legend/legendFilter.ts              |   2 +-
 src/component/legend/scrollableLegendAction.ts    |   2 +-
 src/component/marker/MarkAreaView.ts              |  80 ++---
 src/component/marker/MarkLineView.ts              |  86 ++---
 src/component/marker/MarkPointModel.ts            |   1 -
 src/component/marker/MarkPointView.ts             |  36 +-
 src/component/marker/MarkerModel.ts               |  14 +-
 src/component/marker/MarkerView.ts                |   4 +-
 src/component/marker/markerHelper.ts              |  36 +-
 src/component/parallel.ts                         |  16 +-
 src/component/radar/RadarView.ts                  |  66 ++--
 src/component/timeline/SliderTimelineView.ts      | 189 +++++-----
 src/component/timeline/TimelineModel.ts           |  14 +-
 src/component/timeline/preprocessor.ts            |  16 +-
 src/component/timeline/timelineAction.ts          |   4 +-
 src/component/title.ts                            |  32 +-
 src/component/toolbox/ToolboxModel.ts             |   2 +-
 src/component/toolbox/ToolboxView.ts              |  50 +--
 src/component/toolbox/feature/Brush.ts            |  10 +-
 src/component/toolbox/feature/DataView.ts         | 104 +++---
 src/component/toolbox/feature/DataZoom.ts         |  34 +-
 src/component/toolbox/feature/MagicType.ts        |  37 +-
 src/component/toolbox/feature/SaveAsImage.ts      |  24 +-
 src/component/toolbox/featureManager.ts           |   4 +-
 src/component/tooltip/TooltipHTMLContent.ts       |  64 ++--
 src/component/tooltip/TooltipRichContent.ts       |  16 +-
 src/component/tooltip/TooltipView.ts              | 180 +++++-----
 src/component/visualMap/ContinuousModel.ts        |  40 +--
 src/component/visualMap/ContinuousView.ts         | 142 ++++----
 src/component/visualMap/PiecewiseModel.ts         |  80 ++---
 src/component/visualMap/PiecewiseView.ts          |  56 +--
 src/component/visualMap/VisualMapModel.ts         |  57 ++-
 src/component/visualMap/VisualMapView.ts          |  22 +-
 src/component/visualMap/helper.ts                 |  18 +-
 src/component/visualMap/preprocessor.ts           |   2 +-
 src/component/visualMap/visualEncoding.ts         |  24 +-
 src/config.ts                                     |   2 +-
 src/coord/Axis.ts                                 |  54 +--
 src/coord/View.ts                                 |  38 +-
 src/coord/axisCommonTypes.ts                      |   2 +-
 src/coord/axisHelper.ts                           |  88 ++---
 src/coord/axisModelCommonMixin.ts                 |   6 +-
 src/coord/axisModelCreator.ts                     |  12 +-
 src/coord/axisTickLabelBuilder.ts                 |  82 ++---
 src/coord/calendar/Calendar.ts                    |  82 ++---
 src/coord/calendar/CalendarModel.ts               |   6 +-
 src/coord/calendar/prepareCustom.ts               |   4 +-
 src/coord/cartesian/Axis2D.ts                     |   4 +-
 src/coord/cartesian/Cartesian.ts                  |   2 +-
 src/coord/cartesian/Cartesian2D.ts                |  36 +-
 src/coord/cartesian/Grid.ts                       | 110 +++---
 src/coord/cartesian/cartesianAxisHelper.ts        |  30 +-
 src/coord/cartesian/prepareCustom.ts              |   8 +-
 src/coord/geo/Geo.ts                              |  20 +-
 src/coord/geo/GeoModel.ts                         |  10 +-
 src/coord/geo/Region.ts                           |  40 +--
 src/coord/geo/fix/geoCoord.ts                     |   4 +-
 src/coord/geo/fix/textCoord.ts                    |   4 +-
 src/coord/geo/geoCreator.ts                       |  44 +--
 src/coord/geo/geoJSONLoader.ts                    |  12 +-
 src/coord/geo/geoSVGLoader.ts                     |  28 +-
 src/coord/geo/geoSourceManager.ts                 |  24 +-
 src/coord/geo/mapDataStorage.ts                   |   6 +-
 src/coord/geo/parseGeoJson.ts                     |  28 +-
 src/coord/geo/prepareCustom.ts                    |  10 +-
 src/coord/parallel/AxisModel.ts                   |   6 +-
 src/coord/parallel/Parallel.ts                    | 138 +++----
 src/coord/parallel/ParallelModel.ts               |  10 +-
 src/coord/parallel/parallelCreator.ts             |   6 +-
 src/coord/parallel/parallelPreprocessor.ts        |   6 +-
 src/coord/polar/AngleAxis.ts                      |  26 +-
 src/coord/polar/Polar.ts                          |  50 +--
 src/coord/polar/PolarModel.ts                     |   2 +-
 src/coord/polar/polarCreator.ts                   |  38 +-
 src/coord/polar/prepareCustom.ts                  |  12 +-
 src/coord/radar/Radar.ts                          |  54 +--
 src/coord/radar/RadarModel.ts                     |  30 +-
 src/coord/single/Single.ts                        |  40 +--
 src/coord/single/SingleAxis.ts                    |   2 +-
 src/coord/single/prepareCustom.ts                 |   8 +-
 src/coord/single/singleAxisHelper.ts              |  18 +-
 src/coord/single/singleCreator.ts                 |   6 +-
 src/data/DataDiffer.ts                            |  22 +-
 src/data/Graph.ts                                 |  66 ++--
 src/data/List.ts                                  | 416 +++++++++++-----------
 src/data/OrdinalMeta.ts                           |  10 +-
 src/data/Tree.ts                                  |  42 +--
 src/data/helper/completeDimensions.ts             |  34 +-
 src/data/helper/dataProvider.ts                   |  44 +--
 src/data/helper/dataStackHelper.ts                |   8 +-
 src/data/helper/dimensionHelper.ts                |  26 +-
 src/data/helper/linkList.ts                       |   6 +-
 src/data/helper/sourceHelper.ts                   |  96 ++---
 src/echarts.ts                                    | 270 +++++++-------
 src/export.ts                                     |   2 +-
 src/helper.ts                                     |   4 +-
 src/layout/barGrid.ts                             | 180 +++++-----
 src/layout/barPolar.ts                            |  86 ++---
 src/layout/points.ts                              |  28 +-
 src/loading/default.ts                            |  14 +-
 src/model/Component.ts                            |  18 +-
 src/model/Global.ts                               |  92 ++---
 src/model/Model.ts                                |  14 +-
 src/model/OptionManager.ts                        |  34 +-
 src/model/Series.ts                               |  98 ++---
 src/model/mixin/colorPalette.ts                   |  14 +-
 src/model/mixin/dataFormat.ts                     |  38 +-
 src/model/mixin/itemStyle.ts                      |   6 +-
 src/model/mixin/lineStyle.ts                      |   8 +-
 src/model/mixin/makeStyleMapper.ts                |   6 +-
 src/model/mixin/textStyle.ts                      |   2 +-
 src/model/referHelper.ts                          |  28 +-
 src/preprocessor/backwardCompat.ts                |   4 +-
 src/preprocessor/helper/compatStyle.ts            |  34 +-
 src/processor/dataFilter.ts                       |   6 +-
 src/processor/dataSample.ts                       |  16 +-
 src/processor/dataStack.ts                        |  26 +-
 src/scale/Interval.ts                             |  50 +--
 src/scale/Log.ts                                  |  28 +-
 src/scale/Ordinal.ts                              |   4 +-
 src/scale/Scale.ts                                |   4 +-
 src/scale/Time.ts                                 |  30 +-
 src/scale/helper.ts                               |   8 +-
 src/stream/Scheduler.ts                           |  98 ++---
 src/stream/task.ts                                |  32 +-
 src/util/ECEventProcessor.ts                      |  32 +-
 src/util/KDTree.ts                                |  18 +-
 src/util/animation.ts                             |   4 +-
 src/util/clazz.ts                                 |  36 +-
 src/util/component.ts                             |  34 +-
 src/util/format.ts                                |  38 +-
 src/util/graphic.ts                               |  88 ++---
 src/util/layout.ts                                |  62 ++--
 src/util/model.ts                                 |  66 ++--
 src/util/number.ts                                |  58 +--
 src/util/quickSelect.ts                           |   2 +-
 src/util/shape/sausage.ts                         |  32 +-
 src/util/symbol.ts                                |  12 +-
 src/util/throttle.ts                              |  14 +-
 src/util/types.ts                                 |  18 +-
 src/view/Chart.ts                                 |  22 +-
 src/visual/LegendVisualProvider.ts                |   8 +-
 src/visual/VisualMapping.ts                       |  52 +--
 src/visual/aria.ts                                |  30 +-
 src/visual/dataColor.ts                           |  22 +-
 src/visual/seriesColor.ts                         |  16 +-
 src/visual/symbol.ts                              |  30 +-
 src/visual/visualDefault.ts                       |   2 +-
 src/visual/visualSolution.ts                      |  40 +--
 324 files changed, 6394 insertions(+), 6393 deletions(-)

diff --git a/extension-src/.eslintrc.yaml b/extension-src/.eslintrc.yaml
index 1b663c4..1a7f6e0 100644
--- a/extension-src/.eslintrc.yaml
+++ b/extension-src/.eslintrc.yaml
@@ -24,6 +24,10 @@ rules:
     no-constant-condition: 0
     comma-dangle: 2
     no-debugger: 2
+    prefer-const:
+        - 1
+        -
+            ignoreReadBeforeAssign: true
     no-dupe-keys: 2
     no-empty-character-class: 2
     no-ex-assign: 2
diff --git a/extension-src/bmap/BMapCoordSys.ts b/extension-src/bmap/BMapCoordSys.ts
index 26e08ed..a80f044 100644
--- a/extension-src/bmap/BMapCoordSys.ts
+++ b/extension-src/bmap/BMapCoordSys.ts
@@ -55,7 +55,7 @@ BMapCoordSys.prototype.getBMap = function () {
 };
 
 BMapCoordSys.prototype.dataToPoint = function (data) {
-    let point = new BMap.Point(data[0], data[1]);
+    const point = new BMap.Point(data[0], data[1]);
     // TODO mercator projection is toooooooo slow
     // let mercatorPoint = this._projection.lngLatToPoint(point);
 
@@ -66,13 +66,13 @@ BMapCoordSys.prototype.dataToPoint = function (data) {
     //     Math.round((mercatorPoint.x - this._center.x) / divider + width / 2),
     //     Math.round((this._center.y - mercatorPoint.y) / divider + height / 2)
     // ];
-    let px = this._bmap.pointToOverlayPixel(point);
-    let mapOffset = this._mapOffset;
+    const px = this._bmap.pointToOverlayPixel(point);
+    const mapOffset = this._mapOffset;
     return [px.x - mapOffset[0], px.y - mapOffset[1]];
 };
 
 BMapCoordSys.prototype.pointToData = function (pt) {
-    let mapOffset = this._mapOffset;
+    const mapOffset = this._mapOffset;
     pt = this._bmap.overlayPixelToPoint({
         x: pt[0] + mapOffset[0],
         y: pt[1] + mapOffset[1]
@@ -81,7 +81,7 @@ BMapCoordSys.prototype.pointToData = function (pt) {
 };
 
 BMapCoordSys.prototype.getViewRect = function () {
-    let api = this._api;
+    const api = this._api;
     return new graphic.BoundingRect(0, 0, api.getWidth(), api.getHeight());
 };
 
@@ -90,7 +90,7 @@ BMapCoordSys.prototype.getRoamTransform = function () {
 };
 
 BMapCoordSys.prototype.prepareCustoms = function (data) {
-    let rect = this.getViewRect();
+    const rect = this.getViewRect();
     return {
         coordSys: {
             // The name exposed to user is always 'cartesian2d' but not 'grid'.
@@ -110,10 +110,10 @@ BMapCoordSys.prototype.prepareCustoms = function (data) {
 function dataToCoordSize(dataSize, dataItem) {
     dataItem = dataItem || [0, 0];
     return zrUtil.map([0, 1], function (dimIdx) {
-        let val = dataItem[dimIdx];
-        let halfSize = dataSize[dimIdx] / 2;
-        let p1 = [];
-        let p2 = [];
+        const val = dataItem[dimIdx];
+        const halfSize = dataSize[dimIdx] / 2;
+        const p1 = [];
+        const p2 = [];
         p1[dimIdx] = val - halfSize;
         p2[dimIdx] = val + halfSize;
         p1[1 - dimIdx] = p2[1 - dimIdx] = dataItem[1 - dimIdx];
@@ -121,7 +121,7 @@ function dataToCoordSize(dataSize, dataItem) {
     }, this);
 }
 
-var Overlay;
+let Overlay;
 
 // For deciding which dimensions to use when creating list data
 BMapCoordSys.dimensions = BMapCoordSys.prototype.dimensions;
@@ -152,12 +152,12 @@ function createOverlayCtor() {
 
 BMapCoordSys.create = function (ecModel, api) {
     let bmapCoordSys;
-    let root = api.getDom();
+    const root = api.getDom();
 
     // TODO Dispose
     ecModel.eachComponent('bmap', function (bmapModel) {
-        let painter = api.getZr().painter;
-        let viewportRoot = painter.getViewportRoot();
+        const painter = api.getZr().painter;
+        const viewportRoot = painter.getViewportRoot();
         if (typeof BMap === 'undefined') {
             throw new Error('BMap api is not loaded');
         }
@@ -183,7 +183,7 @@ BMapCoordSys.create = function (ecModel, api) {
             root.appendChild(bmapRoot);
             bmap = bmapModel.__bmap = new BMap.Map(bmapRoot);
 
-            let overlay = new Overlay(viewportRoot);
+            const overlay = new Overlay(viewportRoot);
             bmap.addOverlay(overlay);
 
             // Override
@@ -195,10 +195,10 @@ BMapCoordSys.create = function (ecModel, api) {
 
         // Set bmap options
         // centerAndZoom before layout and render
-        let center = bmapModel.get('center');
-        let zoom = bmapModel.get('zoom');
+        const center = bmapModel.get('center');
+        const zoom = bmapModel.get('zoom');
         if (center && zoom) {
-            let pt = new BMap.Point(center[0], center[1]);
+            const pt = new BMap.Point(center[0], center[1]);
             bmap.centerAndZoom(pt, zoom);
         }
 
diff --git a/extension-src/bmap/BMapModel.ts b/extension-src/bmap/BMapModel.ts
index 382c26b..788ffdf 100644
--- a/extension-src/bmap/BMapModel.ts
+++ b/extension-src/bmap/BMapModel.ts
@@ -38,7 +38,7 @@ export default echarts.extendComponentModel({
     },
 
     centerOrZoomChanged: function (center, zoom) {
-        let option = this.option;
+        const option = this.option;
         return !(v2Equal(center, option.center) && zoom === option.zoom);
     },
 
diff --git a/extension-src/bmap/BMapView.ts b/extension-src/bmap/BMapView.ts
index 8e1ae2a..bde6923 100644
--- a/extension-src/bmap/BMapView.ts
+++ b/extension-src/bmap/BMapView.ts
@@ -26,15 +26,15 @@ export default echarts.extendComponentView({
     render: function (bMapModel, ecModel, api) {
         let rendering = true;
 
-        let bmap = bMapModel.getBMap();
-        let viewportRoot = api.getZr().painter.getViewportRoot();
-        let coordSys = bMapModel.coordinateSystem;
-        let moveHandler = function (type, target) {
+        const bmap = bMapModel.getBMap();
+        const viewportRoot = api.getZr().painter.getViewportRoot();
+        const coordSys = bMapModel.coordinateSystem;
+        const moveHandler = function (type, target) {
             if (rendering) {
                 return;
             }
-            let offsetEl = viewportRoot.parentNode.parentNode.parentNode;
-            let mapOffset = [
+            const offsetEl = viewportRoot.parentNode.parentNode.parentNode;
+            const mapOffset = [
                 -parseInt(offsetEl.style.left, 10) || 0,
                 -parseInt(offsetEl.style.top, 10) || 0
             ];
@@ -70,7 +70,7 @@ export default echarts.extendComponentView({
         this._oldMoveHandler = moveHandler;
         this._oldZoomEndHandler = zoomEndHandler;
 
-        let roam = bMapModel.get('roam');
+        const roam = bMapModel.get('roam');
         if (roam && roam !== 'scale') {
             bmap.enableDragging();
         }
@@ -89,11 +89,11 @@ export default echarts.extendComponentView({
         }
 
         /* map 2.0 */
-        let originalStyle = bMapModel.__mapStyle;
+        const originalStyle = bMapModel.__mapStyle;
 
-        let newMapStyle = bMapModel.get('mapStyle') || {};
+        const newMapStyle = bMapModel.get('mapStyle') || {};
         // FIXME, Not use JSON methods
-        let mapStyleStr = JSON.stringify(newMapStyle);
+        const mapStyleStr = JSON.stringify(newMapStyle);
         if (JSON.stringify(originalStyle) !== mapStyleStr) {
             // FIXME May have blank tile when dragging if setMapStyle
             if (Object.keys(newMapStyle).length) {
@@ -103,11 +103,11 @@ export default echarts.extendComponentView({
         }
 
         /* map 3.0 */
-        let originalStyle2 = bMapModel.__mapStyle2;
+        const originalStyle2 = bMapModel.__mapStyle2;
 
-        let newMapStyle2 = bMapModel.get('mapStyleV2') || {};
+        const newMapStyle2 = bMapModel.get('mapStyleV2') || {};
         // FIXME, Not use JSON methods
-        let mapStyleStr2 = JSON.stringify(newMapStyle2);
+        const mapStyleStr2 = JSON.stringify(newMapStyle2);
         if (JSON.stringify(originalStyle2) !== mapStyleStr2) {
             // FIXME May have blank tile when dragging if setMapStyle
             if (Object.keys(newMapStyle2).length) {
diff --git a/extension-src/bmap/bmap.ts b/extension-src/bmap/bmap.ts
index 991601b..d543d10 100644
--- a/extension-src/bmap/bmap.ts
+++ b/extension-src/bmap/bmap.ts
@@ -37,10 +37,10 @@ echarts.registerAction({
     update: 'updateLayout'
 }, function (payload, ecModel) {
     ecModel.eachComponent('bmap', function (bMapModel) {
-        let bmap = bMapModel.getBMap();
-        let center = bmap.getCenter();
+        const bmap = bMapModel.getBMap();
+        const center = bmap.getCenter();
         bMapModel.setCenterAndZoom([center.lng, center.lat], bmap.getZoom());
     });
 });
 
-export let version = '1.0.0';
+export const version = '1.0.0';
diff --git a/extension-src/dataTool/gexf.ts b/extension-src/dataTool/gexf.ts
index 30fbfe6..41790d7 100644
--- a/extension-src/dataTool/gexf.ts
+++ b/extension-src/dataTool/gexf.ts
@@ -30,7 +30,7 @@ import * as zrUtil from 'zrender/src/core/util';
 export function parse(xml) {
     let doc;
     if (typeof xml === 'string') {
-        let parser = new DOMParser();
+        const parser = new DOMParser();
         doc = parser.parseFromString(xml, 'text/xml');
     }
     else {
@@ -40,16 +40,16 @@ export function parse(xml) {
         return null;
     }
 
-    let gexfRoot = getChildByTagName(doc, 'gexf');
+    const gexfRoot = getChildByTagName(doc, 'gexf');
 
     if (!gexfRoot) {
         return null;
     }
 
-    let graphRoot = getChildByTagName(gexfRoot, 'graph');
+    const graphRoot = getChildByTagName(gexfRoot, 'graph');
 
-    let attributes = parseAttributes(getChildByTagName(graphRoot, 'attributes'));
-    let attributesMap = {};
+    const attributes = parseAttributes(getChildByTagName(graphRoot, 'attributes'));
+    const attributesMap = {};
     for (let i = 0; i < attributes.length; i++) {
         attributesMap[attributes[i].id] = attributes[i];
     }
@@ -73,10 +73,10 @@ function parseAttributes(parent) {
 function parseNodes(parent, attributesMap) {
     return parent ? zrUtil.map(getChildrenByTagName(parent, 'node'), function (nodeDom) {
 
-        let id = getAttr(nodeDom, 'id');
-        let label = getAttr(nodeDom, 'label');
+        const id = getAttr(nodeDom, 'id');
+        const label = getAttr(nodeDom, 'label');
 
-        let node = {
+        const node = {
             id: id,
             name: label,
             itemStyle: {
@@ -84,12 +84,12 @@ function parseNodes(parent, attributesMap) {
             }
         };
 
-        let vizSizeDom = getChildByTagName(nodeDom, 'viz:size');
-        let vizPosDom = getChildByTagName(nodeDom, 'viz:position');
-        let vizColorDom = getChildByTagName(nodeDom, 'viz:color');
+        const vizSizeDom = getChildByTagName(nodeDom, 'viz:size');
+        const vizPosDom = getChildByTagName(nodeDom, 'viz:position');
+        const vizColorDom = getChildByTagName(nodeDom, 'viz:color');
         // let vizShapeDom = getChildByTagName(nodeDom, 'viz:shape');
 
-        let attvaluesDom = getChildByTagName(nodeDom, 'attvalues');
+        const attvaluesDom = getChildByTagName(nodeDom, 'attvalues');
 
         if (vizSizeDom) {
             node.symbolSize = parseFloat(getAttr(vizSizeDom, 'value'));
@@ -110,15 +110,15 @@ function parseNodes(parent, attributesMap) {
             // node.shape = getAttr(vizShapeDom, 'shape');
         // }
         if (attvaluesDom) {
-            let attvalueDomList = getChildrenByTagName(attvaluesDom, 'attvalue');
+            const attvalueDomList = getChildrenByTagName(attvaluesDom, 'attvalue');
 
             node.attributes = {};
 
             for (let j = 0; j < attvalueDomList.length; j++) {
-                let attvalueDom = attvalueDomList[j];
-                let attId = getAttr(attvalueDom, 'for');
+                const attvalueDom = attvalueDomList[j];
+                const attId = getAttr(attvalueDom, 'for');
                 let attValue = getAttr(attvalueDom, 'value');
-                let attribute = attributesMap[attId];
+                const attribute = attributesMap[attId];
 
                 if (attribute) {
                     switch (attribute.type) {
@@ -146,13 +146,13 @@ function parseNodes(parent, attributesMap) {
 
 function parseEdges(parent) {
     return parent ? zrUtil.map(getChildrenByTagName(parent, 'edge'), function (edgeDom) {
-        let id = getAttr(edgeDom, 'id');
-        let label = getAttr(edgeDom, 'label');
+        const id = getAttr(edgeDom, 'id');
+        const label = getAttr(edgeDom, 'label');
 
-        let sourceId = getAttr(edgeDom, 'source');
-        let targetId = getAttr(edgeDom, 'target');
+        const sourceId = getAttr(edgeDom, 'source');
+        const targetId = getAttr(edgeDom, 'target');
 
-        let edge = {
+        const edge = {
             id: id,
             name: label,
             source: sourceId,
@@ -162,10 +162,10 @@ function parseEdges(parent) {
             }
         };
 
-        let lineStyle = edge.lineStyle.normal;
+        const lineStyle = edge.lineStyle.normal;
 
-        let vizThicknessDom = getChildByTagName(edgeDom, 'viz:thickness');
-        let vizColorDom = getChildByTagName(edgeDom, 'viz:color');
+        const vizThicknessDom = getChildByTagName(edgeDom, 'viz:thickness');
+        const vizColorDom = getChildByTagName(edgeDom, 'viz:color');
         // let vizShapeDom = getChildByTagName(edgeDom, 'viz:shape');
 
         if (vizThicknessDom) {
@@ -210,7 +210,7 @@ function getChildByTagName(parent, tagName) {
 
 function getChildrenByTagName(parent, tagName) {
     let node = parent.firstChild;
-    let children = [];
+    const children = [];
     while (node) {
         if (node.nodeName.toLowerCase() === tagName.toLowerCase()) {
             children.push(node);
diff --git a/extension-src/dataTool/index.ts b/extension-src/dataTool/index.ts
index c4c1914..6724942 100644
--- a/extension-src/dataTool/index.ts
+++ b/extension-src/dataTool/index.ts
@@ -22,7 +22,7 @@ import * as echarts from 'echarts';
 import * as gexf from './gexf';
 import prepareBoxplotData from './prepareBoxplotData';
 
-export let version = '1.0.0';
+export const version = '1.0.0';
 
 export {gexf};
 
diff --git a/extension-src/dataTool/prepareBoxplotData.ts b/extension-src/dataTool/prepareBoxplotData.ts
index e7f8edd..ac59a8e 100644
--- a/extension-src/dataTool/prepareBoxplotData.ts
+++ b/extension-src/dataTool/prepareBoxplotData.ts
@@ -48,37 +48,37 @@ import * as numberUtil from '../../src/util/number';
  */
 export default function (rawData, opt) {
     opt = opt || [];
-    let boxData = [];
-    let outliers = [];
-    let axisData = [];
-    let boundIQR = opt.boundIQR;
-    let useExtreme = boundIQR === 'none' || boundIQR === 0;
+    const boxData = [];
+    const outliers = [];
+    const axisData = [];
+    const boundIQR = opt.boundIQR;
+    const useExtreme = boundIQR === 'none' || boundIQR === 0;
 
     for (let i = 0; i < rawData.length; i++) {
         axisData.push(i + '');
-        let ascList = numberUtil.asc(rawData[i].slice());
+        const ascList = numberUtil.asc(rawData[i].slice());
 
-        let Q1 = numberUtil.quantile(ascList, 0.25);
-        let Q2 = numberUtil.quantile(ascList, 0.5);
-        let Q3 = numberUtil.quantile(ascList, 0.75);
-        let min = ascList[0];
-        let max = ascList[ascList.length - 1];
+        const Q1 = numberUtil.quantile(ascList, 0.25);
+        const Q2 = numberUtil.quantile(ascList, 0.5);
+        const Q3 = numberUtil.quantile(ascList, 0.75);
+        const min = ascList[0];
+        const max = ascList[ascList.length - 1];
 
-        let bound = (boundIQR == null ? 1.5 : boundIQR) * (Q3 - Q1);
+        const bound = (boundIQR == null ? 1.5 : boundIQR) * (Q3 - Q1);
 
-        let low = useExtreme
+        const low = useExtreme
             ? min
             : Math.max(min, Q1 - bound);
-        let high = useExtreme
+        const high = useExtreme
             ? max
             : Math.min(max, Q3 + bound);
 
         boxData.push([low, Q1, Q2, Q3, high]);
 
         for (let j = 0; j < ascList.length; j++) {
-            let dataItem = ascList[j];
+            const dataItem = ascList[j];
             if (dataItem < low || dataItem > high) {
-                let outlier = [i, dataItem];
+                const outlier = [i, dataItem];
                 opt.layout === 'vertical' && outlier.reverse();
                 outliers.push(outlier);
             }
diff --git a/src/.eslintrc.yaml b/src/.eslintrc.yaml
index 5d151f6..c2c425b 100644
--- a/src/.eslintrc.yaml
+++ b/src/.eslintrc.yaml
@@ -33,6 +33,10 @@ rules:
             allow:
                 - "warn"
                 - "error"
+    prefer-const:
+        - 1
+        -
+            ignoreReadBeforeAssign: true
     no-constant-condition: 0
     comma-dangle: 2
     no-debugger: 2
diff --git a/src/CoordinateSystem.ts b/src/CoordinateSystem.ts
index c9eec89..a1c2e5b 100644
--- a/src/CoordinateSystem.ts
+++ b/src/CoordinateSystem.ts
@@ -31,7 +31,7 @@ class CoordinateSystemManager {
     create(ecModel: GlobalModel, api: ExtensionAPI): void {
         let coordinateSystems: CoordinateSystemMaster[] = [];
         zrUtil.each(coordinateSystemCreators, function (creater, type) {
-            let list = creater.create(ecModel, api);
+            const list = creater.create(ecModel, api);
             coordinateSystems = coordinateSystems.concat(list || []);
         });
 
diff --git a/src/action/createDataSelectAction.ts b/src/action/createDataSelectAction.ts
index b5fa01c..53bbcf7 100644
--- a/src/action/createDataSelectAction.ts
+++ b/src/action/createDataSelectAction.ts
@@ -40,7 +40,7 @@ export default function (seriesType: string, actionInfos: DataSelectAction[]) {
          * @property {string} name
          */
         echarts.registerAction(actionInfo, function (payload, ecModel) {
-            let selected: Dictionary<Boolean> = {};
+            const selected: Dictionary<Boolean> = {};
             ecModel.eachComponent(
                 {mainType: 'series', subType: seriesType, query: payload},
                 function (seriesModel: SelectableSeriesModel) {
@@ -51,10 +51,10 @@ export default function (seriesType: string, actionInfos: DataSelectAction[]) {
                             payload.dataIndex
                         );
                     }
-                    let data = seriesModel.getData();
+                    const data = seriesModel.getData();
                     // Create selected map
                     data.each(function (idx) {
-                        let name = data.getName(idx);
+                        const name = data.getName(idx);
                         selected[name] = seriesModel.isSelected(name)
                             || false;
                     });
diff --git a/src/action/geoRoam.ts b/src/action/geoRoam.ts
index 33c9b7e..2a452e8 100644
--- a/src/action/geoRoam.ts
+++ b/src/action/geoRoam.ts
@@ -38,17 +38,17 @@ echarts.registerAction({
     event: 'geoRoam',
     update: 'updateTransform'
 }, function (payload, ecModel) {
-    let componentType = payload.componentType || 'series';
+    const componentType = payload.componentType || 'series';
 
     ecModel.eachComponent(
         { mainType: componentType, query: payload },
         function (componentModel) {
-            let geo = componentModel.coordinateSystem;
+            const geo = componentModel.coordinateSystem;
             if (geo.type !== 'geo') {
                 return;
             }
 
-            let res = updateCenterAndZoom(
+            const res = updateCenterAndZoom(
                 geo, payload, componentModel.get('scaleLimit')
             );
 
diff --git a/src/action/roamHelper.ts b/src/action/roamHelper.ts
index e1e7ad0..b45568f 100644
--- a/src/action/roamHelper.ts
+++ b/src/action/roamHelper.ts
@@ -36,11 +36,11 @@ export function updateCenterAndZoom(
         max?: number
     }
 ) {
-    let previousZoom = view.getZoom();
-    let center = view.getCenter();
+    const previousZoom = view.getZoom();
+    const center = view.getCenter();
     let zoom = payload.zoom;
 
-    let point = view.dataToPoint(center);
+    const point = view.dataToPoint(center);
 
     if (payload.dx != null && payload.dy != null) {
         point[0] -= payload.dx;
@@ -50,8 +50,8 @@ export function updateCenterAndZoom(
     }
     if (zoom != null) {
         if (zoomLimit) {
-            let zoomMin = zoomLimit.min || 0;
-            let zoomMax = zoomLimit.max || Infinity;
+            const zoomMin = zoomLimit.min || 0;
+            const zoomMax = zoomLimit.max || Infinity;
             zoom = Math.max(
                 Math.min(previousZoom * zoom, zoomMax),
                 zoomMin
@@ -61,9 +61,9 @@ export function updateCenterAndZoom(
         // Zoom on given point(originX, originY)
         view.scale[0] *= zoom;
         view.scale[1] *= zoom;
-        let position = view.position;
-        let fixX = (payload.originX - position[0]) * (zoom - 1);
-        let fixY = (payload.originY - position[1]) * (zoom - 1);
+        const position = view.position;
+        const fixX = (payload.originX - position[0]) * (zoom - 1);
+        const fixY = (payload.originY - position[1]) * (zoom - 1);
 
         position[0] -= fixX;
         position[1] -= fixY;
diff --git a/src/chart/bar/BarSeries.ts b/src/chart/bar/BarSeries.ts
index 5df7fe5..7d3c9b9 100644
--- a/src/chart/bar/BarSeries.ts
+++ b/src/chart/bar/BarSeries.ts
@@ -106,7 +106,7 @@ class BarSeriesModel extends BaseBarSeriesModel<BarSeriesOption> {
     getProgressiveThreshold() {
         // Do not support progressive in normal mode.
         let progressiveThreshold = this.get('progressiveThreshold');
-        let largeThreshold = this.get('largeThreshold');
+        const largeThreshold = this.get('largeThreshold');
         if (largeThreshold > progressiveThreshold) {
             progressiveThreshold = largeThreshold;
         }
diff --git a/src/chart/bar/BarView.ts b/src/chart/bar/BarView.ts
index 04b5999..53c9817 100644
--- a/src/chart/bar/BarView.ts
+++ b/src/chart/bar/BarView.ts
@@ -58,12 +58,12 @@ function getClipArea(coord: CoordSysOfBar, data: List) {
     let coordSysClipArea;
     if (isCoordinateSystemType<Cartesian2D>(coord, 'cartesian2d')) {
         coordSysClipArea = coord.getArea && coord.getArea();
-        let baseAxis = coord.getBaseAxis();
+        const baseAxis = coord.getBaseAxis();
         // When boundaryGap is false or using time axis. bar may exceed the grid.
         // We should not clip this part.
         // See test/bar2.html
         if (baseAxis.type !== 'category' || !baseAxis.onBand) {
-            let expandWidth = data.getLayout('bandWidth');
+            const expandWidth = data.getLayout('bandWidth');
             if (baseAxis.isHorizontal()) {
                 coordSysClipArea.x -= expandWidth;
                 coordSysClipArea.width += expandWidth * 2;
@@ -94,7 +94,7 @@ class BarView extends ChartView {
     render(seriesModel: BarSeriesModel, ecModel: GlobalModel, api: ExtensionAPI) {
         this._updateDrawMode(seriesModel);
 
-        let coordinateSystemType = seriesModel.get('coordinateSystem');
+        const coordinateSystemType = seriesModel.get('coordinateSystem');
 
         if (coordinateSystemType === 'cartesian2d'
             || coordinateSystemType === 'polar'
@@ -122,7 +122,7 @@ class BarView extends ChartView {
     }
 
     _updateDrawMode(seriesModel: BarSeriesModel) {
-        let isLargeDraw = seriesModel.pipelineContext.large;
+        const isLargeDraw = seriesModel.pipelineContext.large;
         if (this._isLargeDraw == null || isLargeDraw !== this._isLargeDraw) {
             this._isLargeDraw = isLargeDraw;
             this._clear();
@@ -130,12 +130,12 @@ class BarView extends ChartView {
     }
 
     _renderNormal(seriesModel: BarSeriesModel, ecModel: GlobalModel, api: ExtensionAPI) {
-        let group = this.group;
-        let data = seriesModel.getData();
-        let oldData = this._data;
+        const group = this.group;
+        const data = seriesModel.getData();
+        const oldData = this._data;
 
-        let coord = seriesModel.coordinateSystem;
-        let baseAxis = coord.getBaseAxis();
+        const coord = seriesModel.coordinateSystem;
+        const baseAxis = coord.getBaseAxis();
         let isHorizontalOrRadial: boolean;
 
         if (coord.type === 'cartesian2d') {
@@ -145,30 +145,30 @@ class BarView extends ChartView {
             isHorizontalOrRadial = baseAxis.dim === 'angle';
         }
 
-        let animationModel = seriesModel.isAnimationEnabled() ? seriesModel : null;
+        const animationModel = seriesModel.isAnimationEnabled() ? seriesModel : null;
 
-        let needsClip = seriesModel.get('clip', true);
-        let coordSysClipArea = getClipArea(coord, data);
+        const needsClip = seriesModel.get('clip', true);
+        const coordSysClipArea = getClipArea(coord, data);
         // If there is clipPath created in large mode. Remove it.
         group.removeClipPath();
         // We don't use clipPath in normal mode because we needs a perfect animation
         // And don't want the label are clipped.
 
-        let roundCap = seriesModel.get('roundCap', true);
+        const roundCap = seriesModel.get('roundCap', true);
 
-        let drawBackground = seriesModel.get('showBackground', true);
-        let backgroundModel = seriesModel.getModel('backgroundStyle');
+        const drawBackground = seriesModel.get('showBackground', true);
+        const backgroundModel = seriesModel.getModel('backgroundStyle');
 
-        let bgEls: BarView['_backgroundEls'] = [];
-        let oldBgEls = this._backgroundEls;
+        const bgEls: BarView['_backgroundEls'] = [];
+        const oldBgEls = this._backgroundEls;
 
         data.diff(oldData)
             .add(function (dataIndex) {
-                let itemModel = data.getItemModel(dataIndex);
-                let layout = getLayout[coord.type](data, dataIndex, itemModel);
+                const itemModel = data.getItemModel(dataIndex);
+                const layout = getLayout[coord.type](data, dataIndex, itemModel);
 
                 if (drawBackground) {
-                    let bgEl = createBackgroundEl(
+                    const bgEl = createBackgroundEl(
                         coord, isHorizontalOrRadial, layout
                     );
                     bgEl.useStyle(getBarItemStyle(backgroundModel));
@@ -183,14 +183,14 @@ class BarView extends ChartView {
                 if (needsClip) {
                     // Clip will modify the layout params.
                     // And return a boolean to determine if the shape are fully clipped.
-                    let isClipped = clip[coord.type](coordSysClipArea, layout);
+                    const isClipped = clip[coord.type](coordSysClipArea, layout);
                     if (isClipped) {
                         // group.remove(el);
                         return;
                     }
                 }
 
-                let el = elementCreator[coord.type](
+                const el = elementCreator[coord.type](
                     dataIndex, layout, isHorizontalOrRadial, animationModel, false, roundCap
                 );
                 data.setItemGraphicEl(dataIndex, el);
@@ -202,15 +202,15 @@ class BarView extends ChartView {
                 );
             })
             .update(function (newIndex, oldIndex) {
-                let itemModel = data.getItemModel(newIndex);
-                let layout = getLayout[coord.type](data, newIndex, itemModel);
+                const itemModel = data.getItemModel(newIndex);
+                const layout = getLayout[coord.type](data, newIndex, itemModel);
 
                 if (drawBackground) {
-                    let bgEl = oldBgEls[oldIndex];
+                    const bgEl = oldBgEls[oldIndex];
                     bgEl.useStyle(getBarItemStyle(backgroundModel));
                     bgEls[newIndex] = bgEl;
 
-                    let shape = createBackgroundShape(isHorizontalOrRadial, layout, coord);
+                    const shape = createBackgroundShape(isHorizontalOrRadial, layout, coord);
                     updateProps(
                         bgEl as Path, { shape: shape }, animationModel, newIndex
                     );
@@ -223,7 +223,7 @@ class BarView extends ChartView {
                 }
 
                 if (needsClip) {
-                    let isClipped = clip[coord.type](coordSysClipArea, layout);
+                    const isClipped = clip[coord.type](coordSysClipArea, layout);
                     if (isClipped) {
                         group.remove(el);
                         return;
@@ -251,7 +251,7 @@ class BarView extends ChartView {
                 );
             })
             .remove(function (dataIndex) {
-                let el = oldData.getItemGraphicEl(dataIndex);
+                const el = oldData.getItemGraphicEl(dataIndex);
                 if (coord.type === 'cartesian2d') {
                     el && removeRect(dataIndex, animationModel, el as Rect);
                 }
@@ -261,7 +261,7 @@ class BarView extends ChartView {
             })
             .execute();
 
-        let bgGroup = this._backgroundGroup || (this._backgroundGroup = new Group());
+        const bgGroup = this._backgroundGroup || (this._backgroundGroup = new Group());
         bgGroup.removeAll();
 
         for (let i = 0; i < bgEls.length; ++i) {
@@ -278,7 +278,7 @@ class BarView extends ChartView {
         createLarge(seriesModel, this.group);
 
         // Use clipPath in large mode.
-        let clipPath = seriesModel.get('clip', true)
+        const clipPath = seriesModel.get('clip', true)
             ? createClipPath(seriesModel.coordinateSystem, false, seriesModel)
             : null;
         if (clipPath) {
@@ -299,8 +299,8 @@ class BarView extends ChartView {
     }
 
     _clear(ecModel?: GlobalModel) {
-        let group = this.group;
-        let data = this._data;
+        const group = this.group;
+        const data = this._data;
         if (ecModel && ecModel.get('animation') && data && !this._isLargeDraw) {
             this._removeBackground();
             this._backgroundEls = [];
@@ -333,8 +333,8 @@ const clip: {
     [key in 'cartesian2d' | 'polar']: Clipper
 } = {
     cartesian2d(coordSysBoundingRect: RectLike, layout: Rect['shape']) {
-        let signWidth = layout.width < 0 ? -1 : 1;
-        let signHeight = layout.height < 0 ? -1 : 1;
+        const signWidth = layout.width < 0 ? -1 : 1;
+        const signHeight = layout.height < 0 ? -1 : 1;
         // Needs positive width and height
         if (signWidth < 0) {
             layout.x += layout.width;
@@ -345,17 +345,17 @@ const clip: {
             layout.height = -layout.height;
         }
 
-        let x = mathMax(layout.x, coordSysBoundingRect.x);
-        let x2 = mathMin(layout.x + layout.width, coordSysBoundingRect.x + coordSysBoundingRect.width);
-        let y = mathMax(layout.y, coordSysBoundingRect.y);
-        let y2 = mathMin(layout.y + layout.height, coordSysBoundingRect.y + coordSysBoundingRect.height);
+        const x = mathMax(layout.x, coordSysBoundingRect.x);
+        const x2 = mathMin(layout.x + layout.width, coordSysBoundingRect.x + coordSysBoundingRect.width);
+        const y = mathMax(layout.y, coordSysBoundingRect.y);
+        const y2 = mathMin(layout.y + layout.height, coordSysBoundingRect.y + coordSysBoundingRect.height);
 
         layout.x = x;
         layout.y = y;
         layout.width = x2 - x;
         layout.height = y2 - y;
 
-        let clipped = layout.width < 0 || layout.height < 0;
+        const clipped = layout.width < 0 || layout.height < 0;
 
         // Reverse back
         if (signWidth < 0) {
@@ -390,7 +390,7 @@ const elementCreator: {
         dataIndex, layout: RectLayout, isHorizontal,
         animationModel, isUpdate
     ) {
-        let rect = new Rect({
+        const rect = new Rect({
             shape: zrUtil.extend({}, layout),
             z2: 1
         });
@@ -399,9 +399,9 @@ const elementCreator: {
 
         // Animation
         if (animationModel) {
-            let rectShape = rect.shape;
-            let animateProperty = isHorizontal ? 'height' : 'width' as 'width' | 'height';
-            let animateTarget = {} as RectShape;
+            const rectShape = rect.shape;
+            const animateProperty = isHorizontal ? 'height' : 'width' as 'width' | 'height';
+            const animateTarget = {} as RectShape;
             rectShape[animateProperty] = 0;
             animateTarget[animateProperty] = layout[animateProperty];
             (isUpdate ? updateProps : initProps)(rect, {
@@ -420,11 +420,11 @@ const elementCreator: {
         // direction. Notice that if clockwise is true (by default), the sector
         // will always draw clockwisely, no matter whether endAngle is greater
         // or less than startAngle.
-        let clockwise = layout.startAngle < layout.endAngle;
+        const clockwise = layout.startAngle < layout.endAngle;
 
-        let ShapeClass = (!isRadial && roundCap) ? Sausage : Sector;
+        const ShapeClass = (!isRadial && roundCap) ? Sausage : Sector;
 
-        let sector = new ShapeClass({
+        const sector = new ShapeClass({
             shape: zrUtil.defaults({clockwise: clockwise}, layout),
             z2: 1
         });
@@ -433,9 +433,9 @@ const elementCreator: {
 
         // Animation
         if (animationModel) {
-            let sectorShape = sector.shape;
-            let animateProperty = isRadial ? 'r' : 'endAngle' as 'r' | 'endAngle';
-            let animateTarget = {} as SectorShape;
+            const sectorShape = sector.shape;
+            const animateProperty = isRadial ? 'r' : 'endAngle' as 'r' | 'endAngle';
+            const animateTarget = {} as SectorShape;
             sectorShape[animateProperty] = isRadial ? 0 : layout.startAngle;
             animateTarget[animateProperty] = layout[animateProperty];
             (isUpdate ? updateProps : initProps)(sector, {
@@ -486,12 +486,12 @@ const getLayout: {
     [key in 'cartesian2d' | 'polar']: GetLayout
 } = {
     cartesian2d(data, dataIndex, itemModel): RectLayout {
-        let layout = data.getItemLayout(dataIndex) as RectLayout;
-        let fixedLineWidth = getLineWidth(itemModel, layout);
+        const layout = data.getItemLayout(dataIndex) as RectLayout;
+        const fixedLineWidth = getLineWidth(itemModel, layout);
 
         // fix layout with lineWidth
-        let signX = layout.width > 0 ? 1 : -1;
-        let signY = layout.height > 0 ? 1 : -1;
+        const signX = layout.width > 0 ? 1 : -1;
+        const signY = layout.height > 0 ? 1 : -1;
         return {
             x: layout.x + signX * fixedLineWidth / 2,
             y: layout.y + signY * fixedLineWidth / 2,
@@ -501,7 +501,7 @@ const getLayout: {
     },
 
     polar(data, dataIndex, itemModel): SectorLayout {
-        let layout = data.getItemLayout(dataIndex);
+        const layout = data.getItemLayout(dataIndex);
         return {
             cx: layout.cx,
             cy: layout.cy,
@@ -528,11 +528,11 @@ function updateStyle(
     isHorizontal: boolean,
     isPolar: boolean
 ) {
-    let color = data.getItemVisual(dataIndex, 'color');
-    let opacity = data.getItemVisual(dataIndex, 'opacity');
-    let stroke = data.getVisual('borderColor');
-    let itemStyleModel = itemModel.getModel('itemStyle');
-    let hoverStyle = getBarItemStyle(itemModel.getModel(['emphasis', 'itemStyle']));
+    const color = data.getItemVisual(dataIndex, 'color');
+    const opacity = data.getItemVisual(dataIndex, 'opacity');
+    const stroke = data.getVisual('borderColor');
+    const itemStyleModel = itemModel.getModel('itemStyle');
+    const hoverStyle = getBarItemStyle(itemModel.getModel(['emphasis', 'itemStyle']));
 
     if (!isPolar) {
         (el as Rect).setShape('r', itemStyleModel.get('barBorderRadius') || 0);
@@ -547,16 +547,16 @@ function updateStyle(
         getBarItemStyle(itemStyleModel)
     ));
 
-    let cursorStyle = itemModel.getShallow('cursor');
+    const cursorStyle = itemModel.getShallow('cursor');
     cursorStyle && (el as Path).attr('cursor', cursorStyle);
 
     if (!isPolar) {
-        let labelPositionOutside = isHorizontal
+        const labelPositionOutside = isHorizontal
             ? ((layout as RectLayout).height > 0 ? 'bottom' as const : 'top' as const)
             : ((layout as RectLayout).width > 0 ? 'left' as const : 'right' as const);
 
-        let labelModel = itemModel.getModel('label');
-        let hoverLabelModel = itemModel.getModel(['emphasis', 'label']);
+        const labelModel = itemModel.getModel('label');
+        const hoverLabelModel = itemModel.getModel(['emphasis', 'label']);
         setLabelStyle(
             el, labelModel, hoverLabelModel,
             {
@@ -579,10 +579,10 @@ function getLineWidth(
     itemModel: Model<BarSeriesOption>,
     rawLayout: RectLayout
 ) {
-    let lineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY) || 0;
+    const lineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY) || 0;
     // width or height may be NaN for empty data
-    let width = isNaN(rawLayout.width) ? Number.MAX_VALUE : Math.abs(rawLayout.width);
-    let height = isNaN(rawLayout.height) ? Number.MAX_VALUE : Math.abs(rawLayout.height);
+    const width = isNaN(rawLayout.width) ? Number.MAX_VALUE : Math.abs(rawLayout.width);
+    const height = isNaN(rawLayout.height) ? Number.MAX_VALUE : Math.abs(rawLayout.height);
     return Math.min(lineWidth, width, height);
 }
 
@@ -631,16 +631,16 @@ function createLarge(
     incremental?: boolean
 ) {
     // TODO support polar
-    let data = seriesModel.getData();
-    let startPoint = [];
-    let baseDimIdx = data.getLayout('valueAxisHorizontal') ? 1 : 0;
+    const data = seriesModel.getData();
+    const startPoint = [];
+    const baseDimIdx = data.getLayout('valueAxisHorizontal') ? 1 : 0;
     startPoint[1 - baseDimIdx] = data.getLayout('valueAxisStart');
 
-    let largeDataIndices = data.getLayout('largeDataIndices');
-    let barWidth = data.getLayout('barWidth');
+    const largeDataIndices = data.getLayout('largeDataIndices');
+    const barWidth = data.getLayout('barWidth');
 
-    let backgroundModel = seriesModel.getModel('backgroundStyle');
-    let drawBackground = seriesModel.get('showBackground', true);
+    const backgroundModel = seriesModel.getModel('backgroundStyle');
+    const drawBackground = seriesModel.get('showBackground', true);
 
     if (drawBackground) {
         const points = data.getLayout('largeBackgroundPoints');
@@ -661,7 +661,7 @@ function createLarge(
         group.add(bgEl);
     }
 
-    let el = new LargePath({
+    const el = new LargePath({
         shape: {points: data.getLayout('largePoints')},
         incremental: !!incremental
     });
@@ -683,30 +683,30 @@ function createLarge(
 
 // Use throttle to avoid frequently traverse to find dataIndex.
 const largePathUpdateDataIndex = throttle(function (this: LargePath, event: ZRElementEvent) {
-    let largePath = this;
-    let dataIndex = largePathFindDataIndex(largePath, event.offsetX, event.offsetY);
+    const largePath = this;
+    const dataIndex = largePathFindDataIndex(largePath, event.offsetX, event.offsetY);
     getECData(largePath).dataIndex = dataIndex >= 0 ? dataIndex : null;
 }, 30, false);
 
 function largePathFindDataIndex(largePath: LargePath, x: number, y: number) {
-    let baseDimIdx = largePath.__baseDimIdx;
-    let valueDimIdx = 1 - baseDimIdx;
-    let points = largePath.shape.points;
-    let largeDataIndices = largePath.__largeDataIndices;
-    let barWidthHalf = Math.abs(largePath.__barWidth / 2);
-    let startValueVal = largePath.__startPoint[valueDimIdx];
+    const baseDimIdx = largePath.__baseDimIdx;
+    const valueDimIdx = 1 - baseDimIdx;
+    const points = largePath.shape.points;
+    const largeDataIndices = largePath.__largeDataIndices;
+    const barWidthHalf = Math.abs(largePath.__barWidth / 2);
+    const startValueVal = largePath.__startPoint[valueDimIdx];
 
     _eventPos[0] = x;
     _eventPos[1] = y;
-    let pointerBaseVal = _eventPos[baseDimIdx];
-    let pointerValueVal = _eventPos[1 - baseDimIdx];
-    let baseLowerBound = pointerBaseVal - barWidthHalf;
-    let baseUpperBound = pointerBaseVal + barWidthHalf;
+    const pointerBaseVal = _eventPos[baseDimIdx];
+    const pointerValueVal = _eventPos[1 - baseDimIdx];
+    const baseLowerBound = pointerBaseVal - barWidthHalf;
+    const baseUpperBound = pointerBaseVal + barWidthHalf;
 
     for (let i = 0, len = points.length / 2; i < len; i++) {
-        let ii = i * 2;
-        let barBaseVal = points[ii + baseDimIdx];
-        let barValueVal = points[ii + valueDimIdx];
+        const ii = i * 2;
+        const barBaseVal = points[ii + baseDimIdx];
+        const barValueVal = points[ii + valueDimIdx];
         if (
             barBaseVal >= baseLowerBound && barBaseVal <= baseUpperBound
             && (
@@ -727,8 +727,8 @@ function setLargeStyle(
     seriesModel: BarSeriesModel,
     data: List
 ) {
-    let borderColor = data.getVisual('borderColor') || data.getVisual('color');
-    let itemStyle = seriesModel.getModel('itemStyle').getItemStyle(['color', 'borderColor']);
+    const borderColor = data.getVisual('borderColor') || data.getVisual('color');
+    const itemStyle = seriesModel.getModel('itemStyle').getItemStyle(['color', 'borderColor']);
 
     el.useStyle(itemStyle);
     el.style.fill = null;
@@ -741,8 +741,8 @@ function setLargeBackgroundStyle(
     backgroundModel: Model<BarSeriesOption['backgroundStyle']>,
     data: List
 ) {
-    let borderColor = backgroundModel.get('borderColor') || backgroundModel.get('color');
-    let itemStyle = backgroundModel.getItemStyle(['color', 'borderColor']);
+    const borderColor = backgroundModel.get('borderColor') || backgroundModel.get('color');
+    const itemStyle = backgroundModel.getItemStyle(['color', 'borderColor']);
 
     el.useStyle(itemStyle);
     el.style.fill = null;
@@ -784,7 +784,7 @@ function createBackgroundEl(
     isHorizontalOrRadial: boolean,
     layout: SectorLayout | RectLayout
 ): Rect | Sector {
-    let ElementClz = coord.type === 'polar' ? Sector : Rect;
+    const ElementClz = coord.type === 'polar' ? Sector : Rect;
     return new ElementClz({
         shape: createBackgroundShape(isHorizontalOrRadial, layout, coord) as any,
         silent: true,
diff --git a/src/chart/bar/BaseBarSeries.ts b/src/chart/bar/BaseBarSeries.ts
index a0290d3..bf40728 100644
--- a/src/chart/bar/BaseBarSeries.ts
+++ b/src/chart/bar/BaseBarSeries.ts
@@ -87,14 +87,14 @@ class BaseBarSeriesModel<Opts extends BaseBarSeriesOption = BaseBarSeriesOption>
     }
 
     getMarkerPosition(value: ScaleDataValue[]) {
-        let coordSys = this.coordinateSystem;
+        const coordSys = this.coordinateSystem;
         if (coordSys) {
             // PENDING if clamp ?
-            let pt = coordSys.dataToPoint(coordSys.clampData(value));
-            let data = this.getData();
-            let offset = data.getLayout('offset');
-            let size = data.getLayout('size');
-            let offsetIndex = (coordSys as Cartesian2D).getBaseAxis().isHorizontal() ? 0 : 1;
+            const pt = coordSys.dataToPoint(coordSys.clampData(value));
+            const data = this.getData();
+            const offset = data.getLayout('offset');
+            const size = data.getLayout('size');
+            const offsetIndex = (coordSys as Cartesian2D).getBaseAxis().isHorizontal() ? 0 : 1;
             pt[offsetIndex] += offset + size / 2;
             return pt;
         }
diff --git a/src/chart/bar/PictorialBarView.ts b/src/chart/bar/PictorialBarView.ts
index 549bcc4..99479d3 100644
--- a/src/chart/bar/PictorialBarView.ts
+++ b/src/chart/bar/PictorialBarView.ts
@@ -132,16 +132,16 @@ class PictorialBarView extends ChartView {
         ecModel: GlobalModel,
         api: ExtensionAPI
     ) {
-        let group = this.group;
-        let data = seriesModel.getData();
-        let oldData = this._data;
+        const group = this.group;
+        const data = seriesModel.getData();
+        const oldData = this._data;
 
-        let cartesian = seriesModel.coordinateSystem;
-        let baseAxis = cartesian.getBaseAxis();
-        let isHorizontal = baseAxis.isHorizontal();
-        let coordSysRect = cartesian.grid.getRect();
+        const cartesian = seriesModel.coordinateSystem;
+        const baseAxis = cartesian.getBaseAxis();
+        const isHorizontal = baseAxis.isHorizontal();
+        const coordSysRect = cartesian.grid.getRect();
 
-        let opt: CreateOpts = {
+        const opt: CreateOpts = {
             ecSize: {width: api.getWidth(), height: api.getHeight()},
             seriesModel: seriesModel,
             coordSys: cartesian,
@@ -160,10 +160,10 @@ class PictorialBarView extends ChartView {
                     return;
                 }
 
-                let itemModel = getItemModel(data, dataIndex);
-                let symbolMeta = getSymbolMeta(data, dataIndex, itemModel, opt);
+                const itemModel = getItemModel(data, dataIndex);
+                const symbolMeta = getSymbolMeta(data, dataIndex, itemModel, opt);
 
-                let bar = createBar(data, opt, symbolMeta);
+                const bar = createBar(data, opt, symbolMeta);
 
                 data.setItemGraphicEl(dataIndex, bar);
                 group.add(bar);
@@ -178,10 +178,10 @@ class PictorialBarView extends ChartView {
                     return;
                 }
 
-                let itemModel = getItemModel(data, newIndex);
-                let symbolMeta = getSymbolMeta(data, newIndex, itemModel, opt);
+                const itemModel = getItemModel(data, newIndex);
+                const symbolMeta = getSymbolMeta(data, newIndex, itemModel, opt);
 
-                let pictorialShapeStr = getShapeStr(data, symbolMeta);
+                const pictorialShapeStr = getShapeStr(data, symbolMeta);
                 if (bar && pictorialShapeStr !== bar.__pictorialShapeStr) {
                     group.remove(bar);
                     data.setItemGraphicEl(newIndex, null);
@@ -203,7 +203,7 @@ class PictorialBarView extends ChartView {
                 updateCommon(bar, opt, symbolMeta);
             })
             .remove(function (dataIndex) {
-                let bar = oldData.getItemGraphicEl(dataIndex) as PictorialBarElement;
+                const bar = oldData.getItemGraphicEl(dataIndex) as PictorialBarElement;
                 bar && removeBar(
                     oldData, dataIndex, bar.__pictorialSymbolMeta.animationModel, bar
                 );
@@ -216,8 +216,8 @@ class PictorialBarView extends ChartView {
     }
 
     remove(ecModel: GlobalModel, api: ExtensionAPI) {
-        let group = this.group;
-        let data = this._data;
+        const group = this.group;
+        const data = this._data;
         if (ecModel.get('animation')) {
             if (data) {
                 data.eachItemGraphicEl(function (bar: PictorialBarElement) {
@@ -238,16 +238,16 @@ function getSymbolMeta(
     itemModel: ItemModel,
     opt: CreateOpts
 ): SymbolMeta {
-    let layout = data.getItemLayout(dataIndex) as RectLayout;
-    let symbolRepeat = itemModel.get('symbolRepeat');
-    let symbolClip = itemModel.get('symbolClip');
-    let symbolPosition = itemModel.get('symbolPosition') || 'start';
-    let symbolRotate = itemModel.get('symbolRotate');
-    let rotation = (symbolRotate || 0) * Math.PI / 180 || 0;
-    let symbolPatternSize = itemModel.get('symbolPatternSize') || 2;
-    let isAnimationEnabled = itemModel.isAnimationEnabled();
-
-    let symbolMeta: SymbolMeta = {
+    const layout = data.getItemLayout(dataIndex) as RectLayout;
+    const symbolRepeat = itemModel.get('symbolRepeat');
+    const symbolClip = itemModel.get('symbolClip');
+    const symbolPosition = itemModel.get('symbolPosition') || 'start';
+    const symbolRotate = itemModel.get('symbolRotate');
+    const rotation = (symbolRotate || 0) * Math.PI / 180 || 0;
+    const symbolPatternSize = itemModel.get('symbolPatternSize') || 2;
+    const isAnimationEnabled = itemModel.isAnimationEnabled();
+
+    const symbolMeta: SymbolMeta = {
         dataIndex: dataIndex,
         layout: layout,
         itemModel: itemModel,
@@ -272,7 +272,7 @@ function getSymbolMeta(
 
     prepareLineWidth(itemModel, symbolMeta.symbolScale, rotation, opt, symbolMeta);
 
-    let symbolSize = symbolMeta.symbolSize;
+    const symbolSize = symbolMeta.symbolSize;
     let symbolOffset = itemModel.get('symbolOffset');
     if (zrUtil.isArray(symbolOffset)) {
         symbolOffset = [
@@ -298,15 +298,15 @@ function prepareBarLength(
     opt: CreateOpts,
     outputSymbolMeta: SymbolMeta
 ) {
-    let valueDim = opt.valueDim;
-    let symbolBoundingData = itemModel.get('symbolBoundingData');
-    let valueAxis = opt.coordSys.getOtherAxis(opt.coordSys.getBaseAxis());
-    let zeroPx = valueAxis.toGlobalCoord(valueAxis.dataToCoord(0));
-    let pxSignIdx = 1 - +(layout[valueDim.wh] <= 0);
+    const valueDim = opt.valueDim;
+    const symbolBoundingData = itemModel.get('symbolBoundingData');
+    const valueAxis = opt.coordSys.getOtherAxis(opt.coordSys.getBaseAxis());
+    const zeroPx = valueAxis.toGlobalCoord(valueAxis.dataToCoord(0));
+    const pxSignIdx = 1 - +(layout[valueDim.wh] <= 0);
     let boundingLength;
 
     if (zrUtil.isArray(symbolBoundingData)) {
-        let symbolBoundingExtent = [
+        const symbolBoundingExtent = [
             convertToCoordOnAxis(valueAxis, symbolBoundingData[0]) - zeroPx,
             convertToCoordOnAxis(valueAxis, symbolBoundingData[1]) - zeroPx
         ];
@@ -349,9 +349,9 @@ function prepareSymbolSize(
     opt: CreateOpts,
     outputSymbolMeta: SymbolMeta
 ) {
-    let valueDim = opt.valueDim;
-    let categoryDim = opt.categoryDim;
-    let categorySize = Math.abs(layout[categoryDim.wh]);
+    const valueDim = opt.valueDim;
+    const categoryDim = opt.categoryDim;
+    const categorySize = Math.abs(layout[categoryDim.wh]);
 
     let symbolSize = data.getItemVisual(dataIndex, 'symbolSize');
     if (zrUtil.isArray(symbolSize)) {
@@ -381,7 +381,7 @@ function prepareSymbolSize(
     outputSymbolMeta.symbolSize = symbolSize;
 
     // If x or y is less than zero, show reversed shape.
-    let symbolScale = outputSymbolMeta.symbolScale = [
+    const symbolScale = outputSymbolMeta.symbolScale = [
         symbolSize[0] / symbolPatternSize,
         symbolSize[1] / symbolPatternSize
     ];
@@ -428,11 +428,11 @@ function prepareLayoutInfo(
     opt: CreateOpts,
     outputSymbolMeta: SymbolMeta
 ) {
-    let categoryDim = opt.categoryDim;
-    let valueDim = opt.valueDim;
-    let pxSign = outputSymbolMeta.pxSign;
+    const categoryDim = opt.categoryDim;
+    const valueDim = opt.valueDim;
+    const pxSign = outputSymbolMeta.pxSign;
 
-    let unitLength = Math.max(symbolSize[valueDim.index] + valueLineWidth, 0);
+    const unitLength = Math.max(symbolSize[valueDim.index] + valueLineWidth, 0);
     let pathLen = unitLength;
 
     // Note: rotation will not effect the layout of symbols, because user may
@@ -458,14 +458,14 @@ function prepareLayoutInfo(
 
         // Both final repeatTimes and final symbolMarginNumeric area calculated based on
         // boundingLength.
-        let repeatSpecified = isNumeric(symbolRepeat);
+        const repeatSpecified = isNumeric(symbolRepeat);
         let repeatTimes = repeatSpecified
             ? symbolRepeat as number
             : toIntTimes((absBoundingLength + endFix) / uLenWithMargin);
 
         // Adjust calculate margin, to ensure each symbol is displayed
         // entirely in the given layout area.
-        let mDiff = absBoundingLength - repeatTimes * unitLength;
+        const mDiff = absBoundingLength - repeatTimes * unitLength;
         symbolMarginNumeric = mDiff / 2 / (hasEndGap ? repeatTimes : repeatTimes - 1);
         uLenWithMargin = unitLength + symbolMarginNumeric * 2;
         endFix = hasEndGap ? 0 : symbolMarginNumeric * 2;
@@ -482,8 +482,8 @@ function prepareLayoutInfo(
         outputSymbolMeta.symbolMargin = symbolMarginNumeric;
     }
 
-    let sizeFix = pxSign * (pathLen / 2);
-    let pathPosition = outputSymbolMeta.pathPosition = [] as number[];
+    const sizeFix = pxSign * (pathLen / 2);
+    const pathPosition = outputSymbolMeta.pathPosition = [] as number[];
     pathPosition[categoryDim.index] = layout[categoryDim.wh] / 2;
     pathPosition[valueDim.index] = symbolPosition === 'start'
         ? sizeFix
@@ -495,17 +495,17 @@ function prepareLayoutInfo(
         pathPosition[1] += symbolOffset[1];
     }
 
-    let bundlePosition = outputSymbolMeta.bundlePosition = [] as number[];
+    const bundlePosition = outputSymbolMeta.bundlePosition = [] as number[];
     bundlePosition[categoryDim.index] = layout[categoryDim.xy];
     bundlePosition[valueDim.index] = layout[valueDim.xy];
 
-    let barRectShape = outputSymbolMeta.barRectShape = zrUtil.extend({}, layout);
+    const barRectShape = outputSymbolMeta.barRectShape = zrUtil.extend({}, layout);
     barRectShape[valueDim.wh] = pxSign * Math.max(
         Math.abs(layout[valueDim.wh]), Math.abs(pathPosition[valueDim.index] + sizeFix)
     );
     barRectShape[categoryDim.wh] = layout[categoryDim.wh];
 
-    let clipShape = outputSymbolMeta.clipShape = {} as RectShape;
+    const clipShape = outputSymbolMeta.clipShape = {} as RectShape;
     // Consider that symbol may be overflow layout rect.
     clipShape[categoryDim.xy] = -layout[categoryDim.xy];
     clipShape[categoryDim.wh] = opt.ecSize[categoryDim.wh];
@@ -514,8 +514,8 @@ function prepareLayoutInfo(
 }
 
 function createPath(symbolMeta: SymbolMeta) {
-    let symbolPatternSize = symbolMeta.symbolPatternSize;
-    let path = createSymbol(
+    const symbolPatternSize = symbolMeta.symbolPatternSize;
+    const path = createSymbol(
         // Consider texture img, make a big size.
         symbolMeta.symbolType,
         -symbolPatternSize / 2,
@@ -537,15 +537,15 @@ function createPath(symbolMeta: SymbolMeta) {
 function createOrUpdateRepeatSymbols(
     bar: PictorialBarElement, opt: CreateOpts, symbolMeta: SymbolMeta, isUpdate?: boolean
 ) {
-    let bundle = bar.__pictorialBundle;
-    let symbolSize = symbolMeta.symbolSize;
-    let valueLineWidth = symbolMeta.valueLineWidth;
-    let pathPosition = symbolMeta.pathPosition;
-    let valueDim = opt.valueDim;
-    let repeatTimes = symbolMeta.repeatTimes || 0;
+    const bundle = bar.__pictorialBundle;
+    const symbolSize = symbolMeta.symbolSize;
+    const valueLineWidth = symbolMeta.valueLineWidth;
+    const pathPosition = symbolMeta.pathPosition;
+    const valueDim = opt.valueDim;
+    const repeatTimes = symbolMeta.repeatTimes || 0;
 
     let index = 0;
-    let unit = symbolSize[opt.valueDim.index] + valueLineWidth + symbolMeta.symbolMargin * 2;
+    const unit = symbolSize[opt.valueDim.index] + valueLineWidth + symbolMeta.symbolMargin * 2;
 
     eachPath(bar, function (path) {
         path.__pictorialAnimationIndex = index;
@@ -565,12 +565,12 @@ function createOrUpdateRepeatSymbols(
     });
 
     for (; index < repeatTimes; index++) {
-        let path = createPath(symbolMeta);
+        const path = createPath(symbolMeta);
         path.__pictorialAnimationIndex = index;
         path.__pictorialRepeatTimes = repeatTimes;
         bundle.add(path);
 
-        let target = makeTarget(index);
+        const target = makeTarget(index);
 
         updateAttr(
             path,
@@ -595,10 +595,10 @@ function createOrUpdateRepeatSymbols(
     }
 
     function makeTarget(index: number) {
-        let position = pathPosition.slice();
+        const position = pathPosition.slice();
         // (start && pxSign > 0) || (end && pxSign < 0): i = repeatTimes - index
         // Otherwise: i = index;
-        let pxSign = symbolMeta.pxSign;
+        const pxSign = symbolMeta.pxSign;
         let i = index;
         if (symbolMeta.symbolRepeatDirection === 'start' ? pxSign > 0 : pxSign < 0) {
             i = repeatTimes - 1 - index;
@@ -631,7 +631,7 @@ function createOrUpdateSingleSymbol(
     symbolMeta: SymbolMeta,
     isUpdate?: boolean
 ) {
-    let bundle = bar.__pictorialBundle;
+    const bundle = bar.__pictorialBundle;
     let mainPath = bar.__pictorialMainPath;
 
     if (!mainPath) {
@@ -687,7 +687,7 @@ function createOrUpdateBarRect(
     symbolMeta: SymbolMeta,
     isUpdate?: boolean
 ) {
-    let rectShape = zrUtil.extend({}, symbolMeta.barRectShape);
+    const rectShape = zrUtil.extend({}, symbolMeta.barRectShape);
 
     let barRect = bar.__pictorialBarRect;
     if (!barRect) {
@@ -718,10 +718,10 @@ function createOrUpdateClip(
     // If not clip, symbol will be remove and rebuilt.
     if (symbolMeta.symbolClip) {
         let clipPath = bar.__pictorialClipPath;
-        let clipShape = zrUtil.extend({}, symbolMeta.clipShape);
-        let valueDim = opt.valueDim;
-        let animationModel = symbolMeta.animationModel;
-        let dataIndex = symbolMeta.dataIndex;
+        const clipShape = zrUtil.extend({}, symbolMeta.clipShape);
+        const valueDim = opt.valueDim;
+        const animationModel = symbolMeta.animationModel;
+        const dataIndex = symbolMeta.dataIndex;
 
         if (clipPath) {
             graphic.updateProps(
@@ -734,7 +734,7 @@ function createOrUpdateClip(
             bar.__pictorialBundle.setClipPath(clipPath);
             bar.__pictorialClipPath = clipPath;
 
-            let target = {} as RectShape;
+            const target = {} as RectShape;
             target[valueDim.wh] = symbolMeta.clipShape[valueDim.wh];
 
             graphic[isUpdate ? 'updateProps' : 'initProps'](
@@ -745,7 +745,7 @@ function createOrUpdateClip(
 }
 
 function getItemModel(data: List, dataIndex: number) {
-    let itemModel = data.getItemModel(dataIndex) as ItemModel;
+    const itemModel = data.getItemModel(dataIndex) as ItemModel;
     itemModel.getAnimationDelayParams = getAnimationDelayParams;
     itemModel.isAnimationEnabled = isAnimationEnabled;
     return itemModel;
@@ -767,7 +767,7 @@ function isAnimationEnabled(this: ItemModel) {
 function updateHoverAnimation(path: PictorialSymbol, symbolMeta: SymbolMeta) {
     path.off('emphasis').off('normal');
 
-    let scale = symbolMeta.symbolScale.slice();
+    const scale = symbolMeta.symbolScale.slice();
 
     symbolMeta.hoverAnimation && path
         .on('emphasis', function () {
@@ -785,9 +785,9 @@ function updateHoverAnimation(path: PictorialSymbol, symbolMeta: SymbolMeta) {
 
 function createBar(data: List, opt: CreateOpts, symbolMeta: SymbolMeta, isUpdate?: boolean) {
     // bar is the main element for each data.
-    let bar = new graphic.Group() as PictorialBarElement;
+    const bar = new graphic.Group() as PictorialBarElement;
     // bundle is used for location and clip.
-    let bundle = new graphic.Group();
+    const bundle = new graphic.Group();
     bar.add(bundle);
     bar.__pictorialBundle = bundle;
     bundle.attr('position', symbolMeta.bundlePosition.slice());
@@ -810,9 +810,9 @@ function createBar(data: List, opt: CreateOpts, symbolMeta: SymbolMeta, isUpdate
 }
 
 function updateBar(bar: PictorialBarElement, opt: CreateOpts, symbolMeta: SymbolMeta) {
-    let animationModel = symbolMeta.animationModel;
-    let dataIndex = symbolMeta.dataIndex;
-    let bundle = bar.__pictorialBundle;
+    const animationModel = symbolMeta.animationModel;
+    const dataIndex = symbolMeta.dataIndex;
+    const bundle = bar.__pictorialBundle;
 
     graphic.updateProps(
         bundle, {position: symbolMeta.bundlePosition.slice()}, animationModel, dataIndex
@@ -834,10 +834,10 @@ function removeBar(
     data: List, dataIndex: number, animationModel: Model<AnimationOptionMixin>, bar: PictorialBarElement
 ) {
     // Not show text when animating
-    let labelRect = bar.__pictorialBarRect;
+    const labelRect = bar.__pictorialBarRect;
     labelRect && (labelRect.removeTextContent());
 
-    let pathes = [];
+    const pathes = [];
     eachPath(bar, function (path) {
         pathes.push(path);
     });
@@ -902,14 +902,14 @@ function updateCommon(
     opt: CreateOpts,
     symbolMeta: SymbolMeta
 ) {
-    let color = symbolMeta.color;
-    let dataIndex = symbolMeta.dataIndex;
-    let itemModel = symbolMeta.itemModel;
+    const color = symbolMeta.color;
+    const dataIndex = symbolMeta.dataIndex;
+    const itemModel = symbolMeta.itemModel;
     // Color must be excluded.
     // Because symbol provide setColor individually to set fill and stroke
-    let normalStyle = itemModel.getModel('itemStyle').getItemStyle(['color']);
-    let hoverStyle = itemModel.getModel(['emphasis', 'itemStyle']).getItemStyle();
-    let cursorStyle = itemModel.getShallow('cursor');
+    const normalStyle = itemModel.getModel('itemStyle').getItemStyle(['color']);
+    const hoverStyle = itemModel.getModel(['emphasis', 'itemStyle']).getItemStyle();
+    const cursorStyle = itemModel.getShallow('cursor');
 
     eachPath(bar, function (path) {
         // PENDING setColor should be before setStyle!!!
@@ -927,12 +927,12 @@ function updateCommon(
         path.z2 = symbolMeta.z2;
     });
 
-    let barRectHoverStyle = {};
-    let barPositionOutside = opt.valueDim.posDesc[+(symbolMeta.boundingLength > 0)];
-    let barRect = bar.__pictorialBarRect;
+    const barRectHoverStyle = {};
+    const barPositionOutside = opt.valueDim.posDesc[+(symbolMeta.boundingLength > 0)];
+    const barRect = bar.__pictorialBarRect;
 
-    let labelModel = itemModel.getModel('label');
-    let hoverLabelModel = itemModel.getModel(['emphasis', 'label']);
+    const labelModel = itemModel.getModel('label');
+    const hoverLabelModel = itemModel.getModel(['emphasis', 'label']);
 
     graphic.setLabelStyle(
         barRect, labelModel, hoverLabelModel,
@@ -949,7 +949,7 @@ function updateCommon(
 }
 
 function toIntTimes(times: number) {
-    let roundedTimes = Math.round(times);
+    const roundedTimes = Math.round(times);
     // Escapse accurate error
     return Math.abs(times - roundedTimes) < 1e-4
         ? roundedTimes
diff --git a/src/chart/bar/barItemStyle.ts b/src/chart/bar/barItemStyle.ts
index 644daf4..bf00770 100644
--- a/src/chart/bar/barItemStyle.ts
+++ b/src/chart/bar/barItemStyle.ts
@@ -50,9 +50,9 @@ type BarItemStyleKeys = 'fill'
 type ItemStyleProps = Pick<PathStyleProps, BarItemStyleKeys>;
 
 export function getBarItemStyle(model: Model, excludes?: BarItemStyleKeys[]): ItemStyleProps {
-    let style = mapStyle(model, excludes);
+    const style = mapStyle(model, excludes);
     if (model.getBorderLineDash) {
-        let lineDash = model.getBorderLineDash();
+        const lineDash = model.getBorderLineDash();
         lineDash && (style.lineDash = lineDash);
     }
     return style;
diff --git a/src/chart/boxplot/BoxplotView.ts b/src/chart/boxplot/BoxplotView.ts
index 9a69fff..e4b4473 100644
--- a/src/chart/boxplot/BoxplotView.ts
+++ b/src/chart/boxplot/BoxplotView.ts
@@ -37,9 +37,9 @@ class BoxplotView extends ChartView {
     private _data: List;
 
     render(seriesModel: BoxplotSeriesModel, ecModel: GlobalModel, api: ExtensionAPI) {
-        let data = seriesModel.getData();
-        let group = this.group;
-        let oldData = this._data;
+        const data = seriesModel.getData();
+        const group = this.group;
+        const oldData = this._data;
 
         // There is no old data only when first rendering or switching from
         // stream mode to normal mode, where previous elements should be removed.
@@ -47,13 +47,13 @@ class BoxplotView extends ChartView {
             group.removeAll();
         }
 
-        let constDim = seriesModel.get('layout') === 'horizontal' ? 1 : 0;
+        const constDim = seriesModel.get('layout') === 'horizontal' ? 1 : 0;
 
         data.diff(oldData)
             .add(function (newIdx) {
                 if (data.hasValue(newIdx)) {
-                    let itemLayout = data.getItemLayout(newIdx) as BoxplotItemLayout;
-                    let symbolEl = createNormalBox(itemLayout, data, newIdx, constDim, true);
+                    const itemLayout = data.getItemLayout(newIdx) as BoxplotItemLayout;
+                    const symbolEl = createNormalBox(itemLayout, data, newIdx, constDim, true);
                     data.setItemGraphicEl(newIdx, symbolEl);
                     group.add(symbolEl);
                 }
@@ -67,7 +67,7 @@ class BoxplotView extends ChartView {
                     return;
                 }
 
-                let itemLayout = data.getItemLayout(newIdx) as BoxplotItemLayout;
+                const itemLayout = data.getItemLayout(newIdx) as BoxplotItemLayout;
                 if (!symbolEl) {
                     symbolEl = createNormalBox(itemLayout, data, newIdx, constDim);
                 }
@@ -80,7 +80,7 @@ class BoxplotView extends ChartView {
                 data.setItemGraphicEl(newIdx, symbolEl);
             })
             .remove(function (oldIdx) {
-                let el = oldData.getItemGraphicEl(oldIdx);
+                const el = oldData.getItemGraphicEl(oldIdx);
                 el && group.remove(el);
             })
             .execute();
@@ -89,8 +89,8 @@ class BoxplotView extends ChartView {
     }
 
     remove(ecModel: GlobalModel) {
-        let group = this.group;
-        let data = this._data;
+        const group = this.group;
+        const data = this._data;
         this._data = null;
         data && data.eachItemGraphicEl(function (el) {
             el && group.remove(el);
@@ -120,7 +120,7 @@ class BoxPath extends Path<BoxPathProps> {
     }
 
     buildPath(ctx: CanvasRenderingContext2D, shape: BoxPathShape) {
-        let ends = shape.points;
+        const ends = shape.points;
 
         let i = 0;
         ctx.moveTo(ends[i][0], ends[i][1]);
@@ -146,9 +146,9 @@ function createNormalBox(
     constDim: number,
     isInit?: boolean
 ) {
-    let ends = itemLayout.ends;
+    const ends = itemLayout.ends;
 
-    let el = new BoxPath({
+    const el = new BoxPath({
         shape: {
             points: isInit
                 ? transInit(ends, constDim, itemLayout)
@@ -168,8 +168,8 @@ function updateNormalBoxData(
     dataIndex: number,
     isInit?: boolean
 ) {
-    let seriesModel = data.hostModel;
-    let updateMethod = graphic[isInit ? 'initProps' : 'updateProps'];
+    const seriesModel = data.hostModel;
+    const updateMethod = graphic[isInit ? 'initProps' : 'updateProps'];
 
     updateMethod(
         el,
@@ -178,19 +178,19 @@ function updateNormalBoxData(
         dataIndex
     );
 
-    let itemModel = data.getItemModel<BoxplotDataItemOption>(dataIndex);
-    let normalItemStyleModel = itemModel.getModel('itemStyle');
-    let borderColor = data.getItemVisual(dataIndex, 'color');
+    const itemModel = data.getItemModel<BoxplotDataItemOption>(dataIndex);
+    const normalItemStyleModel = itemModel.getModel('itemStyle');
+    const borderColor = data.getItemVisual(dataIndex, 'color');
 
     // Exclude borderColor.
-    let itemStyle = normalItemStyleModel.getItemStyle(['borderColor']) as PathStyleProps;
+    const itemStyle = normalItemStyleModel.getItemStyle(['borderColor']) as PathStyleProps;
     itemStyle.stroke = borderColor;
     itemStyle.strokeNoScale = true;
     el.useStyle(itemStyle);
 
     el.z2 = 100;
 
-    let hoverStyle = itemModel.getModel(EMPHASIS_ITEM_STYLE_PATH).getItemStyle();
+    const hoverStyle = itemModel.getModel(EMPHASIS_ITEM_STYLE_PATH).getItemStyle();
     graphic.enableHoverEmphasis(el, hoverStyle);
 }
 
diff --git a/src/chart/boxplot/boxplotLayout.ts b/src/chart/boxplot/boxplotLayout.ts
index 00bbf86..69c6465 100644
--- a/src/chart/boxplot/boxplotLayout.ts
+++ b/src/chart/boxplot/boxplotLayout.ts
@@ -39,10 +39,10 @@ export interface BoxplotItemLayout {
 
 export default function (ecModel: GlobalModel) {
 
-    let groupResult = groupSeriesByAxis(ecModel);
+    const groupResult = groupSeriesByAxis(ecModel);
 
     each(groupResult, function (groupItem) {
-        let seriesModels = groupItem.seriesModels;
+        const seriesModels = groupItem.seriesModels;
 
         if (!seriesModels.length) {
             return;
@@ -64,11 +64,11 @@ export default function (ecModel: GlobalModel) {
  * Group series by axis.
  */
 function groupSeriesByAxis(ecModel: GlobalModel) {
-    let result: GroupItem[] = [];
-    let axisList: Axis2D[] = [];
+    const result: GroupItem[] = [];
+    const axisList: Axis2D[] = [];
 
     ecModel.eachSeriesByType('boxplot', function (seriesModel: BoxplotSeriesModel) {
-        let baseAxis = seriesModel.getBaseAxis();
+        const baseAxis = seriesModel.getBaseAxis();
         let idx = zrUtil.indexOf(axisList, baseAxis);
 
         if (idx < 0) {
@@ -91,13 +91,13 @@ function groupSeriesByAxis(ecModel: GlobalModel) {
  */
 function calculateBase(groupItem: GroupItem) {
     let extent;
-    let baseAxis = groupItem.axis;
-    let seriesModels = groupItem.seriesModels;
-    let seriesCount = seriesModels.length;
+    const baseAxis = groupItem.axis;
+    const seriesModels = groupItem.seriesModels;
+    const seriesCount = seriesModels.length;
 
-    let boxWidthList: number[] = groupItem.boxWidthList = [];
-    let boxOffsetList: number[] = groupItem.boxOffsetList = [];
-    let boundList: number[][] = [];
+    const boxWidthList: number[] = groupItem.boxWidthList = [];
+    const boxOffsetList: number[] = groupItem.boxOffsetList = [];
+    const boundList: number[][] = [];
 
     let bandWidth: number;
     if (baseAxis.type === 'category') {
@@ -123,9 +123,9 @@ function calculateBase(groupItem: GroupItem) {
         ]);
     });
 
-    let availableWidth = bandWidth * 0.8 - 2;
-    let boxGap = availableWidth / seriesCount * 0.3;
-    let boxWidth = (availableWidth - boxGap * (seriesCount - 1)) / seriesCount;
+    const availableWidth = bandWidth * 0.8 - 2;
+    const boxGap = availableWidth / seriesCount * 0.3;
+    const boxWidth = (availableWidth - boxGap * (seriesCount - 1)) / seriesCount;
     let base = boxWidth / 2 - availableWidth / 2;
 
     each(seriesModels, function (seriesModel, idx) {
@@ -142,29 +142,29 @@ function calculateBase(groupItem: GroupItem) {
  * Calculate points location for each series.
  */
 function layoutSingleSeries(seriesModel: BoxplotSeriesModel, offset: number, boxWidth: number) {
-    let coordSys = seriesModel.coordinateSystem;
-    let data = seriesModel.getData();
-    let halfWidth = boxWidth / 2;
-    let cDimIdx = seriesModel.get('layout') === 'horizontal' ? 0 : 1;
-    let vDimIdx = 1 - cDimIdx;
-    let coordDims = ['x', 'y'];
-    let cDim = data.mapDimension(coordDims[cDimIdx]);
-    let vDims = data.mapDimension(coordDims[vDimIdx], true);
+    const coordSys = seriesModel.coordinateSystem;
+    const data = seriesModel.getData();
+    const halfWidth = boxWidth / 2;
+    const cDimIdx = seriesModel.get('layout') === 'horizontal' ? 0 : 1;
+    const vDimIdx = 1 - cDimIdx;
+    const coordDims = ['x', 'y'];
+    const cDim = data.mapDimension(coordDims[cDimIdx]);
+    const vDims = data.mapDimension(coordDims[vDimIdx], true);
 
     if (cDim == null || vDims.length < 5) {
         return;
     }
 
     for (let dataIndex = 0; dataIndex < data.count(); dataIndex++) {
-        let axisDimVal = data.get(cDim, dataIndex) as number;
+        const axisDimVal = data.get(cDim, dataIndex) as number;
 
-        let median = getPoint(axisDimVal, vDims[2], dataIndex);
-        let end1 = getPoint(axisDimVal, vDims[0], dataIndex);
-        let end2 = getPoint(axisDimVal, vDims[1], dataIndex);
-        let end4 = getPoint(axisDimVal, vDims[3], dataIndex);
-        let end5 = getPoint(axisDimVal, vDims[4], dataIndex);
+        const median = getPoint(axisDimVal, vDims[2], dataIndex);
+        const end1 = getPoint(axisDimVal, vDims[0], dataIndex);
+        const end2 = getPoint(axisDimVal, vDims[1], dataIndex);
+        const end4 = getPoint(axisDimVal, vDims[3], dataIndex);
+        const end5 = getPoint(axisDimVal, vDims[4], dataIndex);
 
-        let ends: number[][] = [];
+        const ends: number[][] = [];
         addBodyEnd(ends, end2, false);
         addBodyEnd(ends, end4, true);
 
@@ -180,8 +180,8 @@ function layoutSingleSeries(seriesModel: BoxplotSeriesModel, offset: number, box
     }
 
     function getPoint(axisDimVal: number, dim: string, dataIndex: number) {
-        let val = data.get(dim, dataIndex) as number;
-        let p = [];
+        const val = data.get(dim, dataIndex) as number;
+        const p = [];
         p[cDimIdx] = axisDimVal;
         p[vDimIdx] = val;
         let point;
@@ -196,8 +196,8 @@ function layoutSingleSeries(seriesModel: BoxplotSeriesModel, offset: number, box
     }
 
     function addBodyEnd(ends: number[][], point: number[], start?: boolean) {
-        let point1 = point.slice();
-        let point2 = point.slice();
+        const point1 = point.slice();
+        const point2 = point.slice();
         point1[cDimIdx] += halfWidth;
         point2[cDimIdx] -= halfWidth;
         start
@@ -206,8 +206,8 @@ function layoutSingleSeries(seriesModel: BoxplotSeriesModel, offset: number, box
     }
 
     function layEndLine(ends: number[][], endCenter: number[]) {
-        let from = endCenter.slice();
-        let to = endCenter.slice();
+        const from = endCenter.slice();
+        const to = endCenter.slice();
         from[cDimIdx] -= halfWidth;
         to[cDimIdx] += halfWidth;
         ends.push(from, to);
diff --git a/src/chart/boxplot/boxplotVisual.ts b/src/chart/boxplot/boxplotVisual.ts
index 1436ba9..c2ebc87 100644
--- a/src/chart/boxplot/boxplotVisual.ts
+++ b/src/chart/boxplot/boxplotVisual.ts
@@ -25,12 +25,12 @@ const borderColorQuery = ['itemStyle', 'borderColor'] as const;
 
 export default function (ecModel: GlobalModel, api: ExtensionAPI) {
 
-    let globalColors = ecModel.get('color');
+    const globalColors = ecModel.get('color');
 
     ecModel.eachRawSeriesByType('boxplot', function (seriesModel: BoxplotSeriesModel) {
 
-        let defaulColor = globalColors[seriesModel.seriesIndex % globalColors.length];
-        let data = seriesModel.getData();
+        const defaulColor = globalColors[seriesModel.seriesIndex % globalColors.length];
+        const data = seriesModel.getData();
 
         data.setVisual({
             legendSymbol: 'roundRect',
@@ -42,7 +42,7 @@ export default function (ecModel: GlobalModel, api: ExtensionAPI) {
         // Only visible series has each data be visual encoded
         if (!ecModel.isSeriesFiltered(seriesModel)) {
             data.each(function (idx) {
-                let itemModel = data.getItemModel<BoxplotDataItemOption>(idx);
+                const itemModel = data.getItemModel<BoxplotDataItemOption>(idx);
                 data.setItemVisual(
                     idx,
                     {color: itemModel.get(borderColorQuery, true)}
diff --git a/src/chart/candlestick/CandlestickSeries.ts b/src/chart/candlestick/CandlestickSeries.ts
index 618227e..12454e0 100644
--- a/src/chart/candlestick/CandlestickSeries.ts
+++ b/src/chart/candlestick/CandlestickSeries.ts
@@ -152,7 +152,7 @@ class CandlestickSeriesModel extends SeriesModel<CandlestickSeriesOption> {
     }
 
     brushSelector(dataIndex: number, data: List, selectors: BrushCommonSelectorsForSeries): boolean {
-        let itemLayout = data.getItemLayout(dataIndex);
+        const itemLayout = data.getItemLayout(dataIndex);
         return itemLayout && selectors.rect(itemLayout.brushRect);
     }
 }
diff --git a/src/chart/candlestick/CandlestickView.ts b/src/chart/candlestick/CandlestickView.ts
index 29712b1..3130a34 100644
--- a/src/chart/candlestick/CandlestickView.ts
+++ b/src/chart/candlestick/CandlestickView.ts
@@ -71,7 +71,7 @@ class CandlestickView extends ChartView {
     }
 
     _updateDrawMode(seriesModel: CandlestickSeriesModel) {
-        let isLargeDraw = seriesModel.pipelineContext.large;
+        const isLargeDraw = seriesModel.pipelineContext.large;
         if (this._isLargeDraw == null || isLargeDraw !== this._isLargeDraw) {
             this._isLargeDraw = isLargeDraw;
             this._clear();
@@ -79,14 +79,14 @@ class CandlestickView extends ChartView {
     }
 
     _renderNormal(seriesModel: CandlestickSeriesModel) {
-        let data = seriesModel.getData();
-        let oldData = this._data;
-        let group = this.group;
-        let isSimpleBox = data.getLayout('isSimpleBox');
+        const data = seriesModel.getData();
+        const oldData = this._data;
+        const group = this.group;
+        const isSimpleBox = data.getLayout('isSimpleBox');
 
-        let needsClip = seriesModel.get('clip', true);
-        let coord = seriesModel.coordinateSystem;
-        let clipArea = coord.getArea && coord.getArea();
+        const needsClip = seriesModel.get('clip', true);
+        const coord = seriesModel.coordinateSystem;
+        const clipArea = coord.getArea && coord.getArea();
 
         // There is no old data only when first rendering or switching from
         // stream mode to normal mode, where previous elements should be removed.
@@ -97,15 +97,13 @@ class CandlestickView extends ChartView {
         data.diff(oldData)
             .add(function (newIdx) {
                 if (data.hasValue(newIdx)) {
-                    let el;
-
-                    let itemLayout = data.getItemLayout(newIdx) as CandlestickItemLayout;
+                    const itemLayout = data.getItemLayout(newIdx) as CandlestickItemLayout;
 
                     if (needsClip && isNormalBoxClipped(clipArea, itemLayout)) {
                         return;
                     }
 
-                    el = createNormalBox(itemLayout, newIdx, true);
+                    const el = createNormalBox(itemLayout, newIdx, true);
                     graphic.initProps(el, {shape: {points: itemLayout.ends}}, seriesModel, newIdx);
 
                     setBoxCommon(el, data, newIdx, isSimpleBox);
@@ -124,7 +122,7 @@ class CandlestickView extends ChartView {
                     return;
                 }
 
-                let itemLayout = data.getItemLayout(newIdx) as CandlestickItemLayout;
+                const itemLayout = data.getItemLayout(newIdx) as CandlestickItemLayout;
                 if (needsClip && isNormalBoxClipped(clipArea, itemLayout)) {
                     group.remove(el);
                     return;
@@ -147,7 +145,7 @@ class CandlestickView extends ChartView {
                 data.setItemGraphicEl(newIdx, el);
             })
             .remove(function (oldIdx) {
-                let el = oldData.getItemGraphicEl(oldIdx);
+                const el = oldData.getItemGraphicEl(oldIdx);
                 el && group.remove(el);
             })
             .execute();
@@ -160,7 +158,7 @@ class CandlestickView extends ChartView {
 
         createLarge(seriesModel, this.group);
 
-        let clipPath = seriesModel.get('clip', true)
+        const clipPath = seriesModel.get('clip', true)
             ? createClipPath(seriesModel.coordinateSystem, false, seriesModel)
             : null;
         if (clipPath) {
@@ -173,15 +171,13 @@ class CandlestickView extends ChartView {
     }
 
     _incrementalRenderNormal(params: StageHandlerProgressParams, seriesModel: CandlestickSeriesModel) {
-        let data = seriesModel.getData();
-        let isSimpleBox = data.getLayout('isSimpleBox');
+        const data = seriesModel.getData();
+        const isSimpleBox = data.getLayout('isSimpleBox');
 
         let dataIndex;
         while ((dataIndex = params.next()) != null) {
-            let el;
-
-            let itemLayout = data.getItemLayout(dataIndex) as CandlestickItemLayout;
-            el = createNormalBox(itemLayout, dataIndex);
+            const itemLayout = data.getItemLayout(dataIndex) as CandlestickItemLayout;
+            const el = createNormalBox(itemLayout, dataIndex);
             setBoxCommon(el, data, dataIndex, isSimpleBox);
 
             el.incremental = true;
@@ -230,7 +226,7 @@ class NormalBoxPath extends Path<NormalBoxPathProps> {
     }
 
     buildPath(ctx: CanvasRenderingContext2D, shape: NormalBoxPathShape) {
-        let ends = shape.points;
+        const ends = shape.points;
 
         if (this.__simpleBox) {
             ctx.moveTo(ends[4][0], ends[4][1]);
@@ -253,7 +249,7 @@ class NormalBoxPath extends Path<NormalBoxPathProps> {
 
 
 function createNormalBox(itemLayout: CandlestickItemLayout, dataIndex: number, isInit?: boolean) {
-    let ends = itemLayout.ends;
+    const ends = itemLayout.ends;
     return new NormalBoxPath({
         shape: {
             points: isInit
@@ -277,14 +273,14 @@ function isNormalBoxClipped(clipArea: CoordinateSystemClipArea, itemLayout: Cand
 }
 
 function setBoxCommon(el: NormalBoxPath, data: List, dataIndex: number, isSimpleBox?: boolean) {
-    let itemModel = data.getItemModel(dataIndex) as Model<CandlestickDataItemOption>;
-    let normalItemStyleModel = itemModel.getModel('itemStyle');
-    let color = data.getItemVisual(dataIndex, 'color');
-    let borderColor = data.getItemVisual(dataIndex, 'borderColor') || color;
+    const itemModel = data.getItemModel(dataIndex) as Model<CandlestickDataItemOption>;
+    const normalItemStyleModel = itemModel.getModel('itemStyle');
+    const color = data.getItemVisual(dataIndex, 'color');
+    const borderColor = data.getItemVisual(dataIndex, 'borderColor') || color;
 
     // Color must be excluded.
     // Because symbol provide setColor individually to set fill and stroke
-    let itemStyle = normalItemStyleModel.getItemStyle(SKIP_PROPS);
+    const itemStyle = normalItemStyleModel.getItemStyle(SKIP_PROPS);
 
     el.useStyle(itemStyle);
     el.style.strokeNoScale = true;
@@ -293,7 +289,7 @@ function setBoxCommon(el: NormalBoxPath, data: List, dataIndex: number, isSimple
 
     el.__simpleBox = isSimpleBox;
 
-    let hoverStyle = itemModel.getModel(EMPHASIS_ITEM_STYLE_PATH).getItemStyle();
+    const hoverStyle = itemModel.getModel(EMPHASIS_ITEM_STYLE_PATH).getItemStyle();
     graphic.enableHoverEmphasis(el, hoverStyle);
 }
 
@@ -334,10 +330,10 @@ class LargeBoxPath extends Path {
     buildPath(ctx: CanvasRenderingContext2D, shape: LargeBoxPathShape) {
         // Drawing lines is more efficient than drawing
         // a whole line or drawing rects.
-        let points = shape.points;
+        const points = shape.points;
         for (let i = 0; i < points.length;) {
             if (this.__sign === points[i++]) {
-                let x = points[i++];
+                const x = points[i++];
                 ctx.moveTo(x, points[i++]);
                 ctx.lineTo(x, points[i++]);
             }
@@ -349,15 +345,15 @@ class LargeBoxPath extends Path {
 }
 
 function createLarge(seriesModel: CandlestickSeriesModel, group: graphic.Group, incremental?: boolean) {
-    let data = seriesModel.getData();
-    let largePoints = data.getLayout('largePoints');
+    const data = seriesModel.getData();
+    const largePoints = data.getLayout('largePoints');
 
-    let elP = new LargeBoxPath({
+    const elP = new LargeBoxPath({
         shape: {points: largePoints},
         __sign: 1
     });
     group.add(elP);
-    let elN = new LargeBoxPath({
+    const elN = new LargeBoxPath({
         shape: {points: largePoints},
         __sign: -1
     });
@@ -373,13 +369,13 @@ function createLarge(seriesModel: CandlestickSeriesModel, group: graphic.Group,
 }
 
 function setLargeStyle(sign: number, el: LargeBoxPath, seriesModel: CandlestickSeriesModel, data: List) {
-    let suffix = sign > 0 ? 'P' : 'N';
-    let borderColor = data.getVisual('borderColor' + suffix)
+    const suffix = sign > 0 ? 'P' : 'N';
+    const borderColor = data.getVisual('borderColor' + suffix)
         || data.getVisual('color' + suffix);
 
     // Color must be excluded.
     // Because symbol provide setColor individually to set fill and stroke
-    let itemStyle = seriesModel.getModel('itemStyle').getItemStyle(SKIP_PROPS);
+    const itemStyle = seriesModel.getModel('itemStyle').getItemStyle(SKIP_PROPS);
 
     el.useStyle(itemStyle);
     el.style.fill = null;
diff --git a/src/chart/candlestick/candlestickLayout.ts b/src/chart/candlestick/candlestickLayout.ts
index cf0fdd9..e64f7ec 100644
--- a/src/chart/candlestick/candlestickLayout.ts
+++ b/src/chart/candlestick/candlestickLayout.ts
@@ -50,18 +50,18 @@ const candlestickLayout: StageHandler = {
 
     reset: function (seriesModel: CandlestickSeriesModel) {
 
-        let coordSys = seriesModel.coordinateSystem;
-        let data = seriesModel.getData();
-        let candleWidth = calculateCandleWidth(seriesModel, data);
-        let cDimIdx = 0;
-        let vDimIdx = 1;
-        let coordDims = ['x', 'y'];
-        let cDim = data.mapDimension(coordDims[cDimIdx]);
-        let vDims = data.mapDimension(coordDims[vDimIdx], true);
-        let openDim = vDims[0];
-        let closeDim = vDims[1];
-        let lowestDim = vDims[2];
-        let highestDim = vDims[3];
+        const coordSys = seriesModel.coordinateSystem;
+        const data = seriesModel.getData();
+        const candleWidth = calculateCandleWidth(seriesModel, data);
+        const cDimIdx = 0;
+        const vDimIdx = 1;
+        const coordDims = ['x', 'y'];
+        const cDim = data.mapDimension(coordDims[cDimIdx]);
+        const vDims = data.mapDimension(coordDims[vDimIdx], true);
+        const openDim = vDims[0];
+        const closeDim = vDims[1];
+        const lowestDim = vDims[2];
+        const highestDim = vDims[3];
 
         data.setLayout({
             candleWidth: candleWidth,
@@ -82,21 +82,21 @@ const candlestickLayout: StageHandler = {
             let dataIndex;
             while ((dataIndex = params.next()) != null) {
 
-                let axisDimVal = data.get(cDim, dataIndex) as number;
-                let openVal = data.get(openDim, dataIndex) as number;
-                let closeVal = data.get(closeDim, dataIndex) as number;
-                let lowestVal = data.get(lowestDim, dataIndex) as number;
-                let highestVal = data.get(highestDim, dataIndex) as number;
+                const axisDimVal = data.get(cDim, dataIndex) as number;
+                const openVal = data.get(openDim, dataIndex) as number;
+                const closeVal = data.get(closeDim, dataIndex) as number;
+                const lowestVal = data.get(lowestDim, dataIndex) as number;
+                const highestVal = data.get(highestDim, dataIndex) as number;
 
-                let ocLow = Math.min(openVal, closeVal);
-                let ocHigh = Math.max(openVal, closeVal);
+                const ocLow = Math.min(openVal, closeVal);
+                const ocHigh = Math.max(openVal, closeVal);
 
-                let ocLowPoint = getPoint(ocLow, axisDimVal);
-                let ocHighPoint = getPoint(ocHigh, axisDimVal);
-                let lowestPoint = getPoint(lowestVal, axisDimVal);
-                let highestPoint = getPoint(highestVal, axisDimVal);
+                const ocLowPoint = getPoint(ocLow, axisDimVal);
+                const ocHighPoint = getPoint(ocHigh, axisDimVal);
+                const lowestPoint = getPoint(lowestVal, axisDimVal);
+                const highestPoint = getPoint(highestVal, axisDimVal);
 
-                let ends: number[][] = [];
+                const ends: number[][] = [];
                 addBodyEnd(ends, ocHighPoint, 0);
                 addBodyEnd(ends, ocLowPoint, 1);
 
@@ -117,7 +117,7 @@ const candlestickLayout: StageHandler = {
             }
 
             function getPoint(val: number, axisDimVal: number) {
-                let p = [];
+                const p = [];
                 p[cDimIdx] = axisDimVal;
                 p[vDimIdx] = val;
                 return (isNaN(axisDimVal) || isNaN(val))
@@ -126,8 +126,8 @@ const candlestickLayout: StageHandler = {
             }
 
             function addBodyEnd(ends: number[][], point: number[], start: number) {
-                let point1 = point.slice();
-                let point2 = point.slice();
+                const point1 = point.slice();
+                const point2 = point.slice();
 
                 point1[cDimIdx] = subPixelOptimize(
                     point1[cDimIdx] + candleWidth / 2, 1, false
@@ -142,8 +142,8 @@ const candlestickLayout: StageHandler = {
             }
 
             function makeBrushRect(lowestVal: number, highestVal: number, axisDimVal: number) {
-                let pmin = getPoint(lowestVal, axisDimVal);
-                let pmax = getPoint(highestVal, axisDimVal);
+                const pmin = getPoint(lowestVal, axisDimVal);
+                const pmax = getPoint(highestVal, axisDimVal);
 
                 pmin[cDimIdx] -= candleWidth / 2;
                 pmax[cDimIdx] -= candleWidth / 2;
@@ -164,19 +164,19 @@ const candlestickLayout: StageHandler = {
 
         function largeProgress(params: StageHandlerProgressParams, data: List) {
             // Structure: [sign, x, yhigh, ylow, sign, x, yhigh, ylow, ...]
-            let points = new LargeArr(params.count * 4);
+            const points = new LargeArr(params.count * 4);
             let offset = 0;
             let point;
-            let tmpIn: number[] = [];
-            let tmpOut: number[] = [];
+            const tmpIn: number[] = [];
+            const tmpOut: number[] = [];
             let dataIndex;
 
             while ((dataIndex = params.next()) != null) {
-                let axisDimVal = data.get(cDim, dataIndex) as number;
-                let openVal = data.get(openDim, dataIndex) as number;
-                let closeVal = data.get(closeDim, dataIndex) as number;
-                let lowestVal = data.get(lowestDim, dataIndex) as number;
-                let highestVal = data.get(highestDim, dataIndex) as number;
+                const axisDimVal = data.get(cDim, dataIndex) as number;
+                const openVal = data.get(openDim, dataIndex) as number;
+                const closeVal = data.get(closeDim, dataIndex) as number;
+                const lowestVal = data.get(lowestDim, dataIndex) as number;
+                const highestVal = data.get(highestDim, dataIndex) as number;
 
                 if (isNaN(axisDimVal) || isNaN(lowestVal) || isNaN(highestVal)) {
                     points[offset++] = NaN;
@@ -222,25 +222,25 @@ function getSign(data: List, dataIndex: number, openVal: number, closeVal: numbe
 }
 
 function calculateCandleWidth(seriesModel: CandlestickSeriesModel, data: List) {
-    let baseAxis = seriesModel.getBaseAxis();
+    const baseAxis = seriesModel.getBaseAxis();
     let extent;
 
-    let bandWidth = baseAxis.type === 'category'
+    const bandWidth = baseAxis.type === 'category'
         ? baseAxis.getBandWidth()
         : (
             extent = baseAxis.getExtent(),
             Math.abs(extent[1] - extent[0]) / data.count()
         );
 
-    let barMaxWidth = parsePercent(
+    const barMaxWidth = parsePercent(
         retrieve2(seriesModel.get('barMaxWidth'), bandWidth),
         bandWidth
     );
-    let barMinWidth = parsePercent(
+    const barMinWidth = parsePercent(
         retrieve2(seriesModel.get('barMinWidth'), 1),
         bandWidth
     );
-    let barWidth = seriesModel.get('barWidth');
+    const barWidth = seriesModel.get('barWidth');
 
     return barWidth != null
         ? parsePercent(barWidth, bandWidth)
diff --git a/src/chart/candlestick/candlestickVisual.ts b/src/chart/candlestick/candlestickVisual.ts
index 443fa52..d55d2e6 100644
--- a/src/chart/candlestick/candlestickVisual.ts
+++ b/src/chart/candlestick/candlestickVisual.ts
@@ -50,7 +50,7 @@ const candlestickVisual: StageHandler = {
             );
         }
 
-        let data = seriesModel.getData();
+        const data = seriesModel.getData();
 
         data.setVisual({
             legendSymbol: 'roundRect',
@@ -65,13 +65,13 @@ const candlestickVisual: StageHandler = {
             return;
         }
 
-        let isLargeRender = seriesModel.pipelineContext.large;
+        const isLargeRender = seriesModel.pipelineContext.large;
         return !isLargeRender && {
             progress(params, data) {
                 let dataIndex;
                 while ((dataIndex = params.next()) != null) {
-                    let itemModel = data.getItemModel(dataIndex);
-                    let sign = data.getItemLayout(dataIndex).sign;
+                    const itemModel = data.getItemModel(dataIndex);
+                    const sign = data.getItemLayout(dataIndex).sign;
 
                     data.setItemVisual(
                         dataIndex,
diff --git a/src/chart/custom.ts b/src/chart/custom.ts
index abf3fd7..3b801ff 100644
--- a/src/chart/custom.ts
+++ b/src/chart/custom.ts
@@ -118,7 +118,7 @@ SeriesModel.extend({
      * @override
      */
     getDataParams: function (dataIndex, dataType, el) {
-        let params = SeriesModel.prototype.getDataParams.apply(this, arguments);
+        const params = SeriesModel.prototype.getDataParams.apply(this, arguments);
         el && (params.info = el.info);
         return params;
     }
@@ -142,10 +142,10 @@ ChartView.extend({
      * @override
      */
     render: function (customSeries, ecModel, api, payload) {
-        let oldData = this._data;
-        let data = customSeries.getData();
-        let group = this.group;
-        let renderItem = makeRenderItem(customSeries, data, ecModel, api);
+        const oldData = this._data;
+        const data = customSeries.getData();
+        const group = this.group;
+        const renderItem = makeRenderItem(customSeries, data, ecModel, api);
 
         // By default, merge mode is applied. In most cases, custom series is
         // used in the scenario that data amount is not large but graphic elements
@@ -159,19 +159,19 @@ ChartView.extend({
                 );
             })
             .update(function (newIdx, oldIdx) {
-                let el = oldData.getItemGraphicEl(oldIdx);
+                const el = oldData.getItemGraphicEl(oldIdx);
                 createOrUpdate(
                     el, newIdx, renderItem(newIdx, payload), customSeries, group, data
                 );
             })
             .remove(function (oldIdx) {
-                let el = oldData.getItemGraphicEl(oldIdx);
+                const el = oldData.getItemGraphicEl(oldIdx);
                 el && group.remove(el);
             })
             .execute();
 
         // Do clipping
-        let clipPath = customSeries.get('clip', true)
+        const clipPath = customSeries.get('clip', true)
             ? createClipPath(customSeries.coordinateSystem, false, customSeries)
             : null;
         if (clipPath) {
@@ -190,8 +190,8 @@ ChartView.extend({
     },
 
     incrementalRender: function (params, customSeries, ecModel, api, payload) {
-        let data = customSeries.getData();
-        let renderItem = makeRenderItem(customSeries, data, ecModel, api);
+        const data = customSeries.getData();
+        const renderItem = makeRenderItem(customSeries, data, ecModel, api);
         function setIncrementalAndHoverLayer(el) {
             if (!el.isGroup) {
                 el.incremental = true;
@@ -199,7 +199,7 @@ ChartView.extend({
             }
         }
         for (let idx = params.start; idx < params.end; idx++) {
-            let el = createOrUpdate(null, idx, renderItem(idx, payload), customSeries, this.group, data);
+            const el = createOrUpdate(null, idx, renderItem(idx, payload), customSeries, this.group, data);
             el.traverse(setIncrementalAndHoverLayer);
         }
     },
@@ -215,7 +215,7 @@ ChartView.extend({
     filterForExposedEvent: function (
         eventType: string, query: EventQueryItem, targetEl: Element, packedEvent: ECEvent
     ): boolean {
-        let elementName = query.element;
+        const elementName = query.element;
         if (elementName == null || targetEl.name === elementName) {
             return true;
         }
@@ -234,15 +234,15 @@ ChartView.extend({
 
 
 function createEl(elOption) {
-    let graphicType = elOption.type;
+    const graphicType = elOption.type;
     let el;
 
     // Those graphic elements are not shapes. They should not be
     // overwritten by users, so do them first.
     if (graphicType === 'path') {
-        let shape = elOption.shape;
+        const shape = elOption.shape;
         // Using pathRect brings convenience to users sacle svg path.
-        let pathRect = (shape.width != null && shape.height != null)
+        const pathRect = (shape.width != null && shape.height != null)
             ? {
                 x: shape.x || 0,
                 y: shape.y || 0,
@@ -250,7 +250,7 @@ function createEl(elOption) {
                 height: shape.height
             }
             : null;
-        let pathData = getPathData(shape);
+        const pathData = getPathData(shape);
         // Path is also used for icon, so layout 'center' by default.
         el = graphicUtil.makePath(pathData, null, pathRect, shape.layout || 'center');
         el.__customPathData = pathData;
@@ -270,7 +270,7 @@ function createEl(elOption) {
         throw new Error('"compoundPath" is not supported yet.');
     }
     else {
-        let Clz = graphicUtil.getShapeClass(graphicType);
+        const Clz = graphicUtil.getShapeClass(graphicType);
 
         if (__DEV__) {
             zrUtil.assert(Clz, 'graphic type "' + graphicType + '" can not be found.');
@@ -286,8 +286,8 @@ function createEl(elOption) {
 }
 
 function updateEl(el, dataIndex, elOption, animatableModel, data, isInit, isRoot) {
-    let transitionProps = {};
-    let elOptionStyle = elOption.style || {};
+    const transitionProps = {};
+    const elOptionStyle = elOption.style || {};
 
     elOption.shape && (transitionProps.shape = zrUtil.clone(elOption.shape));
     elOption.position && (transitionProps.position = elOption.position.slice());
@@ -296,14 +296,14 @@ function updateEl(el, dataIndex, elOption, animatableModel, data, isInit, isRoot
     elOption.rotation && (transitionProps.rotation = elOption.rotation);
 
     if (el.type === 'image' && elOption.style) {
-        let targetStyle = transitionProps.style = {};
+        const targetStyle = transitionProps.style = {};
         zrUtil.each(['x', 'y', 'width', 'height'], function (prop) {
             prepareStyleTransition(prop, targetStyle, elOptionStyle, el.style, isInit);
         });
     }
 
     if (el.type === 'text' && elOption.style) {
-        let targetStyle = transitionProps.style = {};
+        const targetStyle = transitionProps.style = {};
         zrUtil.each(['x', 'y'], function (prop) {
             prepareStyleTransition(prop, targetStyle, elOptionStyle, el.style, isInit);
         });
@@ -349,7 +349,7 @@ function updateEl(el, dataIndex, elOption, animatableModel, data, isInit, isRoot
 
     // If `elOption.styleEmphasis` is `false`, remove hover style. The
     // logic is ensured by `graphicUtil.setElementHoverStyle`.
-    let styleEmphasis = elOption.styleEmphasis;
+    const styleEmphasis = elOption.styleEmphasis;
     // hoverStyle should always be set here, because if the hover style
     // may already be changed, where the inner cache should be reset.
     graphicUtil.enableElementHoverEmphasis(el, styleEmphasis);
@@ -366,8 +366,8 @@ function prepareStyleTransition(prop, targetStyle, elOptionStyle, oldElStyle, is
 }
 
 function makeRenderItem(customSeries, data, ecModel, api) {
-    let renderItem = customSeries.get('renderItem');
-    let coordSys = customSeries.coordinateSystem;
+    const renderItem = customSeries.get('renderItem');
+    const coordSys = customSeries.coordinateSystem;
     let prepareResult = {};
 
     if (coordSys) {
@@ -384,7 +384,7 @@ function makeRenderItem(customSeries, data, ecModel, api) {
             : prepareCustoms[coordSys.type](coordSys);
     }
 
-    let userAPI = zrUtil.defaults({
+    const userAPI = zrUtil.defaults({
         getWidth: api.getWidth,
         getHeight: api.getHeight,
         getZr: api.getZr,
@@ -398,7 +398,7 @@ function makeRenderItem(customSeries, data, ecModel, api) {
         font: font
     }, prepareResult.api || {});
 
-    let userParams = {
+    const userParams = {
         // The life cycle of context: current round of rendering.
         // The global life cycle is probably not necessary, because
         // user can store global status by themselves.
@@ -471,13 +471,13 @@ function makeRenderItem(customSeries, data, ecModel, api) {
         dataIndexInside == null && (dataIndexInside = currDataIndexInside);
         updateCache(dataIndexInside);
 
-        let itemStyle = currItemModel.getModel(ITEM_STYLE_NORMAL_PATH).getItemStyle();
+        const itemStyle = currItemModel.getModel(ITEM_STYLE_NORMAL_PATH).getItemStyle();
 
         currVisualColor != null && (itemStyle.fill = currVisualColor);
-        let opacity = data.getItemVisual(dataIndexInside, 'opacity');
+        const opacity = data.getItemVisual(dataIndexInside, 'opacity');
         opacity != null && (itemStyle.opacity = opacity);
 
-        let labelModel = extra
+        const labelModel = extra
             ? applyExtraBefore(extra, currLabelNormalModel)
             : currLabelNormalModel;
 
@@ -510,9 +510,9 @@ function makeRenderItem(customSeries, data, ecModel, api) {
         dataIndexInside == null && (dataIndexInside = currDataIndexInside);
         updateCache(dataIndexInside);
 
-        let itemStyle = currItemModel.getModel(ITEM_STYLE_EMPHASIS_PATH).getItemStyle();
+        const itemStyle = currItemModel.getModel(ITEM_STYLE_EMPHASIS_PATH).getItemStyle();
 
-        let labelModel = extra
+        const labelModel = extra
             ? applyExtraBefore(extra, currLabelEmphasisModel)
             : currLabelEmphasisModel;
 
@@ -557,7 +557,7 @@ function makeRenderItem(customSeries, data, ecModel, api) {
      */
     function barLayout(opt) {
         if (coordSys.getBaseAxis) {
-            let baseAxis = coordSys.getBaseAxis();
+            const baseAxis = coordSys.getBaseAxis();
             return getLayoutOnAxis(zrUtil.defaults({axis: baseAxis}, opt), api);
         }
     }
@@ -585,12 +585,12 @@ function makeRenderItem(customSeries, data, ecModel, api) {
 }
 
 function wrapEncodeDef(data) {
-    let encodeDef = {};
+    const encodeDef = {};
     zrUtil.each(data.dimensions, function (dimName, dataDimIndex) {
-        let dimInfo = data.getDimensionInfo(dimName);
+        const dimInfo = data.getDimensionInfo(dimName);
         if (!dimInfo.isExtraCoord) {
-            let coordDim = dimInfo.coordDim;
-            let dataDims = encodeDef[coordDim] = encodeDef[coordDim] || [];
+            const coordDim = dimInfo.coordDim;
+            const dataDims = encodeDef[coordDim] = encodeDef[coordDim] || [];
             dataDims[dimInfo.coordDimIndex] = dataDimIndex;
         }
     });
@@ -616,11 +616,11 @@ function doCreateOrUpdate(el, dataIndex, elOption, animatableModel, group, data,
     //     regard "return;" as "show nothing element whatever", so make a exception to meet the
     //     most cases.)
 
-    let simplyRemove = !elOption; // `null`/`undefined`/`false`
+    const simplyRemove = !elOption; // `null`/`undefined`/`false`
     elOption = elOption || {};
-    let elOptionType = elOption.type;
-    let elOptionShape = elOption.shape;
-    let elOptionStyle = elOption.style;
+    const elOptionType = elOption.type;
+    const elOptionShape = elOption.shape;
+    const elOptionStyle = elOption.style;
 
     if (el && (
         simplyRemove
@@ -649,7 +649,7 @@ function doCreateOrUpdate(el, dataIndex, elOption, animatableModel, group, data,
         return;
     }
 
-    let isInit = !el;
+    const isInit = !el;
     !el && (el = createEl(elOption));
     updateEl(el, dataIndex, elOption, animatableModel, data, isInit, isRoot);
 
@@ -680,12 +680,12 @@ function doCreateOrUpdate(el, dataIndex, elOption, animatableModel, group, data,
 // User can remove a single child by set its `ignore` as `true` or replace
 // it by another element, where its `$merge` can be set as `true` if necessary.
 function mergeChildren(el, dataIndex, elOption, animatableModel, data) {
-    let newChildren = elOption.children;
-    let newLen = newChildren ? newChildren.length : 0;
-    let mergeChildren = elOption.$mergeChildren;
+    const newChildren = elOption.children;
+    const newLen = newChildren ? newChildren.length : 0;
+    const mergeChildren = elOption.$mergeChildren;
     // `diffChildrenByName` has been deprecated.
-    let byName = mergeChildren === 'byName' || elOption.diffChildrenByName;
-    let notMerge = mergeChildren === false;
+    const byName = mergeChildren === 'byName' || elOption.diffChildrenByName;
+    const notMerge = mergeChildren === false;
 
     // For better performance on roam update, only enter if necessary.
     if (!newLen && !byName && !notMerge) {
@@ -742,14 +742,14 @@ function diffGroupChildren(context) {
 }
 
 function getKey(item, idx) {
-    let name = item && item.name;
+    const name = item && item.name;
     return name != null ? name : GROUP_DIFF_PREFIX + idx;
 }
 
 function processAddUpdate(newIndex, oldIndex) {
-    let context = this.context;
-    let childOption = newIndex != null ? context.newChildren[newIndex] : null;
-    let child = oldIndex != null ? context.oldChildren[oldIndex] : null;
+    const context = this.context;
+    const childOption = newIndex != null ? context.newChildren[newIndex] : null;
+    const child = oldIndex != null ? context.oldChildren[oldIndex] : null;
 
     doCreateOrUpdate(
         child,
@@ -765,7 +765,7 @@ function processAddUpdate(newIndex, oldIndex) {
 // textFill, textStroke, textStrokeWidth.
 // We have to do this trick.
 function applyExtraBefore(extra, model) {
-    let dummyModel = new Model({}, model);
+    const dummyModel = new Model({}, model);
     zrUtil.each(CACHED_LABEL_STYLE_PROPERTIES, function (stylePropName, modelPropName) {
         if (extra.hasOwnProperty(stylePropName)) {
             dummyModel.option[modelPropName] = extra[stylePropName];
@@ -775,7 +775,7 @@ function applyExtraBefore(extra, model) {
 }
 
 function applyExtraAfter(itemStyle, extra) {
-    for (let key in extra) {
+    for (const key in extra) {
         if (extra.hasOwnProperty(key)
             || !CACHED_LABEL_STYLE_PROPERTIES.hasOwnProperty(key)
         ) {
@@ -785,8 +785,8 @@ function applyExtraAfter(itemStyle, extra) {
 }
 
 function processRemove(oldIndex) {
-    let context = this.context;
-    let child = context.oldChildren[oldIndex];
+    const context = this.context;
+    const child = context.oldChildren[oldIndex];
     child && context.group.remove(child);
 }
 
diff --git a/src/chart/effectScatter/EffectScatterView.ts b/src/chart/effectScatter/EffectScatterView.ts
index a95d015..d5ff8bd 100644
--- a/src/chart/effectScatter/EffectScatterView.ts
+++ b/src/chart/effectScatter/EffectScatterView.ts
@@ -39,18 +39,18 @@ class EffectScatterView extends ChartView {
     }
 
     render(seriesModel: EffectScatterSeriesModel, ecModel: GlobalModel, api: ExtensionAPI) {
-        let data = seriesModel.getData();
-        let effectSymbolDraw = this._symbolDraw;
+        const data = seriesModel.getData();
+        const effectSymbolDraw = this._symbolDraw;
         effectSymbolDraw.updateData(data);
         this.group.add(effectSymbolDraw.group);
     }
 
     updateTransform(seriesModel: EffectScatterSeriesModel, ecModel: GlobalModel, api: ExtensionAPI) {
-        let data = seriesModel.getData();
+        const data = seriesModel.getData();
 
         this.group.dirty();
 
-        let res = pointsLayout().reset(seriesModel, ecModel, api) as StageHandlerProgressExecutor;
+        const res = pointsLayout().reset(seriesModel, ecModel, api) as StageHandlerProgressExecutor;
         if (res.progress) {
             res.progress({
                 start: 0,
@@ -63,7 +63,7 @@ class EffectScatterView extends ChartView {
     }
 
     _updateGroupTransform(seriesModel: EffectScatterSeriesModel) {
-        let coordSys = seriesModel.coordinateSystem;
+        const coordSys = seriesModel.coordinateSystem;
         if (coordSys && coordSys.getRoamTransform) {
             this.group.transform = matrix.clone(coordSys.getRoamTransform());
             this.group.decomposeTransform();
diff --git a/src/chart/funnel/FunnelSeries.ts b/src/chart/funnel/FunnelSeries.ts
index 1a3ee5c..a00c36e 100644
--- a/src/chart/funnel/FunnelSeries.ts
+++ b/src/chart/funnel/FunnelSeries.ts
@@ -119,8 +119,8 @@ class FunnelSeriesModel extends SeriesModel<FunnelSeriesOption> {
         // Extend labelLine emphasis
         defaultEmphasis(option, 'labelLine', ['show']);
 
-        let labelLineNormalOpt = option.labelLine;
-        let labelLineEmphasisOpt = option.emphasis.labelLine;
+        const labelLineNormalOpt = option.labelLine;
+        const labelLineEmphasisOpt = option.emphasis.labelLine;
         // Not show label line if `label.normal.show = false`
         labelLineNormalOpt.show = labelLineNormalOpt.show
             && option.label.show;
@@ -130,10 +130,10 @@ class FunnelSeriesModel extends SeriesModel<FunnelSeriesOption> {
 
     // Overwrite
     getDataParams(dataIndex: number) {
-        let data = this.getData();
-        let params = super.getDataParams(dataIndex);
-        let valueDim = data.mapDimension('value');
-        let sum = data.getSum(valueDim);
+        const data = this.getData();
+        const params = super.getDataParams(dataIndex);
+        const valueDim = data.mapDimension('value');
+        const sum = data.getSum(valueDim);
         // Percent is 0 if sum is 0
         params.percent = !sum ? 0 : +(data.get(valueDim, dataIndex) as number / sum * 100).toFixed(2);
 
diff --git a/src/chart/funnel/FunnelView.ts b/src/chart/funnel/FunnelView.ts
index 0c460e9..f01234f 100644
--- a/src/chart/funnel/FunnelView.ts
+++ b/src/chart/funnel/FunnelView.ts
@@ -41,9 +41,9 @@ class FunnelPiece extends graphic.Group {
     constructor(data: List, idx: number) {
         super();
 
-        let polygon = new graphic.Polygon();
-        let labelLine = new graphic.Polyline();
-        let text = new graphic.Text();
+        const polygon = new graphic.Polygon();
+        const labelLine = new graphic.Polyline();
+        const text = new graphic.Text();
         this.add(polygon);
         this.add(labelLine);
         polygon.setTextContent(text);
@@ -53,8 +53,8 @@ class FunnelPiece extends graphic.Group {
 
     highDownOnUpdate(fromState: DisplayState, toState: DisplayState) {
 
-        let labelLine = this.childAt(1) as graphic.Polyline;
-        let text = this.childAt(2) as graphic.Text;
+        const labelLine = this.childAt(1) as graphic.Polyline;
+        const text = this.childAt(2) as graphic.Text;
 
         if (toState === 'emphasis') {
             labelLine.ignore = (labelLine as FunnelLabelEl).hoverIgnore;
@@ -68,11 +68,11 @@ class FunnelPiece extends graphic.Group {
 
     updateData(data: List, idx: number, firstCreate?: boolean) {
 
-        let polygon = this.childAt(0) as graphic.Polygon;
+        const polygon = this.childAt(0) as graphic.Polygon;
 
-        let seriesModel = data.hostModel;
-        let itemModel = data.getItemModel<FunnelDataItemOption>(idx);
-        let layout = data.getItemLayout(idx);
+        const seriesModel = data.hostModel;
+        const itemModel = data.getItemModel<FunnelDataItemOption>(idx);
+        const layout = data.getItemLayout(idx);
         let opacity = itemModel.get(opacityAccessPath);
         opacity = opacity == null ? 1 : opacity;
 
@@ -102,8 +102,8 @@ class FunnelPiece extends graphic.Group {
         }
 
         // Update common style
-        let itemStyleModel = itemModel.getModel('itemStyle');
-        let visualColor = data.getItemVisual(idx, 'color');
+        const itemStyleModel = itemModel.getModel('itemStyle');
+        const visualColor = data.getItemVisual(idx, 'color');
 
         polygon.setStyle(
             zrUtil.defaults(
@@ -123,21 +123,21 @@ class FunnelPiece extends graphic.Group {
     }
 
     _updateLabel(data: List, idx: number) {
-        let polygon = this.childAt(0);
-        let labelLine = this.childAt(1) as graphic.Polyline;
-        let labelText = polygon.getTextContent();
-
-        let seriesModel = data.hostModel;
-        let itemModel = data.getItemModel<FunnelDataItemOption>(idx);
-        let layout = data.getItemLayout(idx);
-        let labelLayout = layout.label;
+        const polygon = this.childAt(0);
+        const labelLine = this.childAt(1) as graphic.Polyline;
+        const labelText = polygon.getTextContent();
+
+        const seriesModel = data.hostModel;
+        const itemModel = data.getItemModel<FunnelDataItemOption>(idx);
+        const layout = data.getItemLayout(idx);
+        const labelLayout = layout.label;
         // let visualColor = data.getItemVisual(idx, 'color');
 
-        let labelModel = itemModel.getModel('label');
-        let labelHoverModel = itemModel.getModel(['emphasis', 'label']);
-        let labelLineModel = itemModel.getModel('labelLine');
-        let labelLineHoverModel = itemModel.getModel(['emphasis', 'labelLine']);
-        let visualColor = data.getItemVisual(idx, 'color');
+        const labelModel = itemModel.getModel('label');
+        const labelHoverModel = itemModel.getModel(['emphasis', 'label']);
+        const labelLineModel = itemModel.getModel('labelLine');
+        const labelLineHoverModel = itemModel.getModel(['emphasis', 'labelLine']);
+        const visualColor = data.getItemVisual(idx, 'color');
 
         graphic.setLabelStyle(
             labelText, labelModel, labelHoverModel,
@@ -205,21 +205,21 @@ class FunnelView extends ChartView {
     private _data: List;
 
     render(seriesModel: FunnelSeriesModel, ecModel: GlobalModel, api: ExtensionAPI) {
-        let data = seriesModel.getData();
-        let oldData = this._data;
+        const data = seriesModel.getData();
+        const oldData = this._data;
 
-        let group = this.group;
+        const group = this.group;
 
         data.diff(oldData)
             .add(function (idx) {
-                let funnelPiece = new FunnelPiece(data, idx);
+                const funnelPiece = new FunnelPiece(data, idx);
 
                 data.setItemGraphicEl(idx, funnelPiece);
 
                 group.add(funnelPiece);
             })
             .update(function (newIdx, oldIdx) {
-                let piece = oldData.getItemGraphicEl(oldIdx) as FunnelPiece;
+                const piece = oldData.getItemGraphicEl(oldIdx) as FunnelPiece;
 
                 piece.updateData(data, newIdx);
 
@@ -227,7 +227,7 @@ class FunnelView extends ChartView {
                 data.setItemGraphicEl(newIdx, piece);
             })
             .remove(function (idx) {
-                let piece = oldData.getItemGraphicEl(idx);
+                const piece = oldData.getItemGraphicEl(idx);
                 group.remove(piece);
             })
             .execute();
diff --git a/src/chart/funnel/funnelLayout.ts b/src/chart/funnel/funnelLayout.ts
index 385d2a3..470c478 100644
--- a/src/chart/funnel/funnelLayout.ts
+++ b/src/chart/funnel/funnelLayout.ts
@@ -37,12 +37,12 @@ function getViewRect(seriesModel: FunnelSeriesModel, api: ExtensionAPI) {
 }
 
 function getSortedIndices(data: List, sort: FunnelSeriesOption['sort']) {
-    let valueDim = data.mapDimension('value');
-    let valueArr = data.mapArray(valueDim, function (val: number) {
+    const valueDim = data.mapDimension('value');
+    const valueArr = data.mapArray(valueDim, function (val: number) {
         return val;
     });
-    let indices: number[] = [];
-    let isAscending = sort === 'ascending';
+    const indices: number[] = [];
+    const isAscending = sort === 'ascending';
     for (let i = 0, len = data.count(); i < len; i++) {
         indices[i] = i;
     }
@@ -63,16 +63,16 @@ function getSortedIndices(data: List, sort: FunnelSeriesOption['sort']) {
 
 function labelLayout(data: List) {
     data.each(function (idx) {
-        let itemModel = data.getItemModel(idx) as Model<FunnelDataItem>;
-        let labelModel = itemModel.getModel('label');
-        let labelPosition = labelModel.get('position');
+        const itemModel = data.getItemModel(idx) as Model<FunnelDataItem>;
+        const labelModel = itemModel.getModel('label');
+        const labelPosition = labelModel.get('position');
 
-        let labelLineModel = itemModel.getModel('labelLine');
+        const labelLineModel = itemModel.getModel('labelLine');
 
-        let layout = data.getItemLayout(idx);
-        let points = layout.points;
+        const layout = data.getItemLayout(idx);
+        const points = layout.points;
 
-        let isLabelInside = labelPosition === 'inner'
+        const isLabelInside = labelPosition === 'inner'
             || labelPosition === 'inside' || labelPosition === 'center'
             || labelPosition === 'insideLeft' || labelPosition === 'insideRight';
 
@@ -105,7 +105,7 @@ function labelLayout(data: List) {
             let x1;
             let y1;
             let x2;
-            let labelLineLen = labelLineModel.get('length');
+            const labelLineLen = labelLineModel.get('length');
             if (labelPosition === 'left') {
                 // Left side
                 x1 = (points[3][0] + points[0][0]) / 2;
@@ -162,7 +162,7 @@ function labelLayout(data: List) {
                 textX = x2 + 5;
                 textAlign = 'left';
             }
-            let y2 = y1;
+            const y2 = y1;
 
             linePoints = [[x1, y1], [x2, y2]];
             textY = y2;
@@ -181,17 +181,17 @@ function labelLayout(data: List) {
 
 export default function (ecModel: GlobalModel, api: ExtensionAPI) {
     ecModel.eachSeriesByType('funnel', function (seriesModel: FunnelSeriesModel) {
-        let data = seriesModel.getData();
-        let valueDim = data.mapDimension('value');
-        let sort = seriesModel.get('sort');
-        let viewRect = getViewRect(seriesModel, api);
+        const data = seriesModel.getData();
+        const valueDim = data.mapDimension('value');
+        const sort = seriesModel.get('sort');
+        const viewRect = getViewRect(seriesModel, api);
         let indices = getSortedIndices(data, sort);
 
-        let sizeExtent = [
+        const sizeExtent = [
             parsePercent(seriesModel.get('minSize'), viewRect.width),
             parsePercent(seriesModel.get('maxSize'), viewRect.width)
         ];
-        let dataExtent = data.getDataExtent(valueDim);
+        const dataExtent = data.getDataExtent(valueDim);
         let min = seriesModel.get('min');
         let max = seriesModel.get('max');
         if (min == null) {
@@ -201,16 +201,16 @@ export default function (ecModel: GlobalModel, api: ExtensionAPI) {
             max = dataExtent[1];
         }
 
-        let funnelAlign = seriesModel.get('funnelAlign');
+        const funnelAlign = seriesModel.get('funnelAlign');
         let gap = seriesModel.get('gap');
         let itemHeight = (viewRect.height - gap * (data.count() - 1)) / data.count();
 
         let y = viewRect.y;
 
-        let getLinePoints = function (idx: number, offY: number) {
+        const getLinePoints = function (idx: number, offY: number) {
             // End point index is data.count() and we assign it 0
-            let val = data.get(valueDim, idx) as number || 0;
-            let itemWidth = linearMap(val, [min, max], sizeExtent, true);
+            const val = data.get(valueDim, idx) as number || 0;
+            const itemWidth = linearMap(val, [min, max], sizeExtent, true);
             let x0;
             switch (funnelAlign) {
                 case 'left':
@@ -238,10 +238,10 @@ export default function (ecModel: GlobalModel, api: ExtensionAPI) {
         }
 
         for (let i = 0; i < indices.length; i++) {
-            let idx = indices[i];
-            let nextIdx = indices[i + 1];
+            const idx = indices[i];
+            const nextIdx = indices[i + 1];
 
-            let itemModel = data.getItemModel<FunnelDataItem>(idx);
+            const itemModel = data.getItemModel<FunnelDataItem>(idx);
             let height = itemModel.get(['itemStyle', 'height']);
             if (height == null) {
                 height = itemHeight;
@@ -253,8 +253,8 @@ export default function (ecModel: GlobalModel, api: ExtensionAPI) {
                 }
             }
 
-            let start = getLinePoints(idx, y);
-            let end = getLinePoints(nextIdx, y + height);
+            const start = getLinePoints(idx, y);
+            const end = getLinePoints(nextIdx, y + height);
 
             y += height + gap;
 
diff --git a/src/chart/gauge/GaugeView.ts b/src/chart/gauge/GaugeView.ts
index 60c2b16..fe590bd 100644
--- a/src/chart/gauge/GaugeView.ts
+++ b/src/chart/gauge/GaugeView.ts
@@ -34,13 +34,13 @@ interface PosInfo {
 }
 
 function parsePosition(seriesModel: GaugeSeriesModel, api: ExtensionAPI): PosInfo {
-    let center = seriesModel.get('center');
-    let width = api.getWidth();
-    let height = api.getHeight();
-    let size = Math.min(width, height);
-    let cx = parsePercent(center[0], api.getWidth());
-    let cy = parsePercent(center[1], api.getHeight());
-    let r = parsePercent(seriesModel.get('radius'), size / 2);
+    const center = seriesModel.get('center');
+    const width = api.getWidth();
+    const height = api.getHeight();
+    const size = Math.min(width, height);
+    const cx = parsePercent(center[0], api.getWidth());
+    const cy = parsePercent(center[1], api.getHeight());
+    const r = parsePercent(seriesModel.get('radius'), size / 2);
 
     return {
         cx: cx,
@@ -75,8 +75,8 @@ class GaugeView extends ChartView {
 
         this.group.removeAll();
 
-        let colorList = seriesModel.get(['axisLine', 'lineStyle', 'color']);
-        let posInfo = parsePosition(seriesModel, api);
+        const colorList = seriesModel.get(['axisLine', 'lineStyle', 'color']);
+        const posInfo = parsePosition(seriesModel, api);
 
         this._renderMain(
             seriesModel, ecModel, api, colorList, posInfo
@@ -92,26 +92,26 @@ class GaugeView extends ChartView {
         colorList: [number, ColorString][],
         posInfo: PosInfo
     ) {
-        let group = this.group;
+        const group = this.group;
 
-        let axisLineModel = seriesModel.getModel('axisLine');
-        let lineStyleModel = axisLineModel.getModel('lineStyle');
+        const axisLineModel = seriesModel.getModel('axisLine');
+        const lineStyleModel = axisLineModel.getModel('lineStyle');
 
-        let clockwise = seriesModel.get('clockwise');
+        const clockwise = seriesModel.get('clockwise');
         let startAngle = -seriesModel.get('startAngle') / 180 * Math.PI;
         let endAngle = -seriesModel.get('endAngle') / 180 * Math.PI;
 
-        let angleRangeSpan = (endAngle - startAngle) % PI2;
+        const angleRangeSpan = (endAngle - startAngle) % PI2;
 
         let prevEndAngle = startAngle;
-        let axisLineWidth = lineStyleModel.get('width');
-        let showAxis = axisLineModel.get('show');
+        const axisLineWidth = lineStyleModel.get('width');
+        const showAxis = axisLineModel.get('show');
 
         for (let i = 0; showAxis && i < colorList.length; i++) {
             // Clamp
-            let percent = Math.min(Math.max(colorList[i][0], 0), 1);
+            const percent = Math.min(Math.max(colorList[i][0], 0), 1);
             endAngle = startAngle + angleRangeSpan * percent;
-            let sector = new graphic.Sector({
+            const sector = new graphic.Sector({
                 shape: {
                     startAngle: prevEndAngle,
                     endAngle: endAngle,
@@ -139,7 +139,7 @@ class GaugeView extends ChartView {
             prevEndAngle = endAngle;
         }
 
-        let getColor = function (percent: number) {
+        const getColor = function (percent: number) {
             // Less than 0
             if (percent <= 0) {
                 return colorList[0][1];
@@ -157,7 +157,7 @@ class GaugeView extends ChartView {
         };
 
         if (!clockwise) {
-            let tmp = startAngle;
+            const tmp = startAngle;
             startAngle = endAngle;
             endAngle = tmp;
         }
@@ -190,34 +190,34 @@ class GaugeView extends ChartView {
         endAngle: number,
         clockwise: boolean
     ) {
-        let group = this.group;
-        let cx = posInfo.cx;
-        let cy = posInfo.cy;
-        let r = posInfo.r;
+        const group = this.group;
+        const cx = posInfo.cx;
+        const cy = posInfo.cy;
+        const r = posInfo.r;
 
-        let minVal = +seriesModel.get('min');
-        let maxVal = +seriesModel.get('max');
+        const minVal = +seriesModel.get('min');
+        const maxVal = +seriesModel.get('max');
 
-        let splitLineModel = seriesModel.getModel('splitLine');
-        let tickModel = seriesModel.getModel('axisTick');
-        let labelModel = seriesModel.getModel('axisLabel');
+        const splitLineModel = seriesModel.getModel('splitLine');
+        const tickModel = seriesModel.getModel('axisTick');
+        const labelModel = seriesModel.getModel('axisLabel');
 
-        let splitNumber = seriesModel.get('splitNumber');
-        let subSplitNumber = tickModel.get('splitNumber');
+        const splitNumber = seriesModel.get('splitNumber');
+        const subSplitNumber = tickModel.get('splitNumber');
 
-        let splitLineLen = parsePercent(
+        const splitLineLen = parsePercent(
             splitLineModel.get('length'), r
         );
-        let tickLen = parsePercent(
+        const tickLen = parsePercent(
             tickModel.get('length'), r
         );
 
         let angle = startAngle;
-        let step = (endAngle - startAngle) / splitNumber;
-        let subStep = step / subSplitNumber;
+        const step = (endAngle - startAngle) / splitNumber;
+        const subStep = step / subSplitNumber;
 
-        let splitLineStyle = splitLineModel.getModel('lineStyle').getLineStyle();
-        let tickLineStyle = tickModel.getModel('lineStyle').getLineStyle();
+        const splitLineStyle = splitLineModel.getModel('lineStyle').getLineStyle();
+        const tickLineStyle = tickModel.getModel('lineStyle').getLineStyle();
 
         let unitX;
         let unitY;
@@ -227,7 +227,7 @@ class GaugeView extends ChartView {
             unitY = Math.sin(angle);
             // Split line
             if (splitLineModel.get('show')) {
-                let splitLine = new graphic.Line({
+                const splitLine = new graphic.Line({
                     shape: {
                         x1: unitX * r + cx,
                         y1: unitY * r + cy,
@@ -248,12 +248,12 @@ class GaugeView extends ChartView {
 
             // Label
             if (labelModel.get('show')) {
-                let label = formatLabel(
+                const label = formatLabel(
                     round(i / splitNumber * (maxVal - minVal) + minVal),
                     labelModel.get('formatter')
                 );
-                let distance = labelModel.get('distance');
-                let autoColor = getColor(i / splitNumber);
+                const distance = labelModel.get('distance');
+                const autoColor = getColor(i / splitNumber);
 
                 group.add(new graphic.Text({
                     style: graphic.createTextStyle(labelModel, {
@@ -272,7 +272,7 @@ class GaugeView extends ChartView {
                 for (let j = 0; j <= subSplitNumber; j++) {
                     unitX = Math.cos(angle);
                     unitY = Math.sin(angle);
-                    let tickLine = new graphic.Line({
+                    const tickLine = new graphic.Line({
                         shape: {
                             x1: unitX * r + cx,
                             y1: unitY * r + cy,
@@ -311,8 +311,8 @@ class GaugeView extends ChartView {
         clockwise: boolean
     ) {
 
-        let group = this.group;
-        let oldData = this._data;
+        const group = this.group;
+        const oldData = this._data;
 
         if (!seriesModel.get(['pointer', 'show'])) {
             // Remove old element
@@ -322,15 +322,15 @@ class GaugeView extends ChartView {
             return;
         }
 
-        let valueExtent = [+seriesModel.get('min'), +seriesModel.get('max')];
-        let angleExtent = [startAngle, endAngle];
+        const valueExtent = [+seriesModel.get('min'), +seriesModel.get('max')];
+        const angleExtent = [startAngle, endAngle];
 
-        let data = seriesModel.getData();
-        let valueDim = data.mapDimension('value');
+        const data = seriesModel.getData();
+        const valueDim = data.mapDimension('value');
 
         data.diff(oldData)
             .add(function (idx) {
-                let pointer = new PointerPath({
+                const pointer = new PointerPath({
                     shape: {
                         angle: startAngle
                     }
@@ -346,7 +346,7 @@ class GaugeView extends ChartView {
                 data.setItemGraphicEl(idx, pointer);
             })
             .update(function (newIdx, oldIdx) {
-                let pointer = oldData.getItemGraphicEl(oldIdx) as PointerPath;
+                const pointer = oldData.getItemGraphicEl(oldIdx) as PointerPath;
 
                 graphic.updateProps(pointer, {
                     shape: {
@@ -358,14 +358,14 @@ class GaugeView extends ChartView {
                 data.setItemGraphicEl(newIdx, pointer);
             })
             .remove(function (idx) {
-                let pointer = oldData.getItemGraphicEl(idx);
+                const pointer = oldData.getItemGraphicEl(idx);
                 group.remove(pointer);
             })
             .execute();
 
         data.eachItemGraphicEl(function (pointer: PointerPath, idx) {
-            let itemModel = data.getItemModel<GaugeDataItemOption>(idx);
-            let pointerModel = itemModel.getModel('pointer');
+            const itemModel = data.getItemModel<GaugeDataItemOption>(idx);
+            const pointerModel = itemModel.getModel('pointer');
 
             pointer.setShape({
                 x: posInfo.cx,
@@ -399,18 +399,18 @@ class GaugeView extends ChartView {
         getColor: (percent: number) => ColorString,
         posInfo: PosInfo
     ) {
-        let data = seriesModel.getData();
-        let valueDim = data.mapDimension('value');
-        let titleModel = seriesModel.getModel('title');
+        const data = seriesModel.getData();
+        const valueDim = data.mapDimension('value');
+        const titleModel = seriesModel.getModel('title');
         if (titleModel.get('show')) {
-            let offsetCenter = titleModel.get('offsetCenter');
-            let x = posInfo.cx + parsePercent(offsetCenter[0], posInfo.r);
-            let y = posInfo.cy + parsePercent(offsetCenter[1], posInfo.r);
-
-            let minVal = +seriesModel.get('min');
-            let maxVal = +seriesModel.get('max');
-            let value = seriesModel.getData().get(valueDim, 0) as number;
-            let autoColor = getColor(
+            const offsetCenter = titleModel.get('offsetCenter');
+            const x = posInfo.cx + parsePercent(offsetCenter[0], posInfo.r);
+            const y = posInfo.cy + parsePercent(offsetCenter[1], posInfo.r);
+
+            const minVal = +seriesModel.get('min');
+            const maxVal = +seriesModel.get('max');
+            const value = seriesModel.getData().get(valueDim, 0) as number;
+            const autoColor = getColor(
                 linearMap(value, [minVal, maxVal], [0, 1], true)
             );
 
@@ -435,18 +435,18 @@ class GaugeView extends ChartView {
         getColor: (percent: number) => ColorString,
         posInfo: PosInfo
     ) {
-        let detailModel = seriesModel.getModel('detail');
-        let minVal = +seriesModel.get('min');
-        let maxVal = +seriesModel.get('max');
+        const detailModel = seriesModel.getModel('detail');
+        const minVal = +seriesModel.get('min');
+        const maxVal = +seriesModel.get('max');
         if (detailModel.get('show')) {
-            let offsetCenter = detailModel.get('offsetCenter');
-            let x = posInfo.cx + parsePercent(offsetCenter[0], posInfo.r);
-            let y = posInfo.cy + parsePercent(offsetCenter[1], posInfo.r);
-            let width = parsePercent(detailModel.get('width'), posInfo.r);
-            let height = parsePercent(detailModel.get('height'), posInfo.r);
-            let data = seriesModel.getData();
-            let value = data.get(data.mapDimension('value'), 0) as number;
-            let autoColor = getColor(
+            const offsetCenter = detailModel.get('offsetCenter');
+            const x = posInfo.cx + parsePercent(offsetCenter[0], posInfo.r);
+            const y = posInfo.cy + parsePercent(offsetCenter[1], posInfo.r);
+            const width = parsePercent(detailModel.get('width'), posInfo.r);
+            const height = parsePercent(detailModel.get('height'), posInfo.r);
+            const data = seriesModel.getData();
+            const value = data.get(data.mapDimension('value'), 0) as number;
+            const autoColor = getColor(
                 linearMap(value, [minVal, maxVal], [0, 1], true)
             );
 
diff --git a/src/chart/gauge/PointerPath.ts b/src/chart/gauge/PointerPath.ts
index 5eac5dc..e0f03b1 100644
--- a/src/chart/gauge/PointerPath.ts
+++ b/src/chart/gauge/PointerPath.ts
@@ -46,14 +46,14 @@ export default class PointerPath extends Path<PointerPathProps> {
     }
 
     buildPath(ctx: CanvasRenderingContext2D, shape: PointerShape) {
-        let mathCos = Math.cos;
-        let mathSin = Math.sin;
+        const mathCos = Math.cos;
+        const mathSin = Math.sin;
 
-        let r = shape.r;
-        let width = shape.width;
+        const r = shape.r;
+        const width = shape.width;
         let angle = shape.angle;
-        let x = shape.x - mathCos(angle) * width * (width >= r / 3 ? 1 : 2);
-        let y = shape.y - mathSin(angle) * width * (width >= r / 3 ? 1 : 2);
+        const x = shape.x - mathCos(angle) * width * (width >= r / 3 ? 1 : 2);
+        const y = shape.y - mathSin(angle) * width * (width >= r / 3 ? 1 : 2);
 
         angle = shape.angle - Math.PI / 2;
         ctx.moveTo(x, y);
diff --git a/src/chart/graph/GraphSeries.ts b/src/chart/graph/GraphSeries.ts
index fa713f3..bac92d4 100644
--- a/src/chart/graph/GraphSeries.ts
+++ b/src/chart/graph/GraphSeries.ts
@@ -227,7 +227,7 @@ class GraphSeriesModel extends SeriesModel<GraphSeriesOption> {
     init(option: GraphSeriesOption) {
         super.init.apply(this, arguments as any);
 
-        let self = this;
+        const self = this;
         function getCategoriesData() {
             return self._categoriesData;
         }
@@ -255,9 +255,9 @@ class GraphSeriesModel extends SeriesModel<GraphSeriesOption> {
     }
 
     getInitialData(option: GraphSeriesOption, ecModel: GlobalModel) {
-        let edges = option.edges || option.links || [];
-        let nodes = option.data || option.nodes || [];
-        let self = this;
+        const edges = option.edges || option.links || [];
+        const nodes = option.data || option.nodes || [];
+        const self = this;
 
         if (nodes && edges) {
             return createGraphFromNodeEdge(nodes, edges, this, true, beforeLink).data;
@@ -266,9 +266,9 @@ class GraphSeriesModel extends SeriesModel<GraphSeriesOption> {
         function beforeLink(nodeData: List, edgeData: List) {
             // Overwrite nodeData.getItemModel to
             nodeData.wrapMethod('getItemModel', function (model) {
-                let categoriesModels = self._categoriesModels;
-                let categoryIdx = model.getShallow('category');
-                let categoryModel = categoriesModels[categoryIdx];
+                const categoriesModels = self._categoriesModels;
+                const categoryIdx = model.getShallow('category');
+                const categoryModel = categoriesModels[categoryIdx];
                 if (categoryModel) {
                     categoryModel.parentModel = model.parentModel;
                     model.parentModel = categoryModel;
@@ -276,15 +276,15 @@ class GraphSeriesModel extends SeriesModel<GraphSeriesOption> {
                 return model;
             });
 
-            let edgeLabelModel = self.getModel('edgeLabel');
+            const edgeLabelModel = self.getModel('edgeLabel');
             // For option `edgeLabel` can be found by label.xxx.xxx on item mode.
-            let fakeSeriesModel = new Model(
+            const fakeSeriesModel = new Model(
                 {label: edgeLabelModel.option},
                 edgeLabelModel.parentModel,
                 ecModel
             );
-            let emphasisEdgeLabelModel = self.getModel(['emphasis', 'edgeLabel']);
-            let emphasisFakeSeriesModel = new Model(
+            const emphasisEdgeLabelModel = self.getModel(['emphasis', 'edgeLabel']);
+            const emphasisFakeSeriesModel = new Model(
                 {emphasis: {label: emphasisEdgeLabelModel.option}},
                 emphasisEdgeLabelModel.parentModel,
                 ecModel
@@ -323,13 +323,13 @@ class GraphSeriesModel extends SeriesModel<GraphSeriesOption> {
      */
     formatTooltip(dataIndex: number, multipleSeries: boolean, dataType: string) {
         if (dataType === 'edge') {
-            let nodeData = this.getData();
-            let params = this.getDataParams(dataIndex, dataType);
-            let edge = nodeData.graph.getEdgeByIndex(dataIndex);
-            let sourceName = nodeData.getName(edge.node1.dataIndex);
-            let targetName = nodeData.getName(edge.node2.dataIndex);
+            const nodeData = this.getData();
+            const params = this.getDataParams(dataIndex, dataType);
+            const edge = nodeData.graph.getEdgeByIndex(dataIndex);
+            const sourceName = nodeData.getName(edge.node1.dataIndex);
+            const targetName = nodeData.getName(edge.node2.dataIndex);
 
-            let html = [];
+            const html = [];
             sourceName != null && html.push(sourceName);
             targetName != null && html.push(targetName);
             let htmlStr = encodeHTML(html.join(' > '));
@@ -345,13 +345,13 @@ class GraphSeriesModel extends SeriesModel<GraphSeriesOption> {
     }
 
     _updateCategoriesData() {
-        let categories = zrUtil.map(this.option.categories || [], function (category) {
+        const categories = zrUtil.map(this.option.categories || [], function (category) {
             // Data must has value
             return category.value != null ? category : zrUtil.extend({
                 value: 0
             }, category);
         });
-        let categoriesData = new List(['value'], this);
+        const categoriesData = new List(['value'], this);
         categoriesData.initData(categories);
 
         this._categoriesData = categoriesData;
diff --git a/src/chart/graph/GraphView.ts b/src/chart/graph/GraphView.ts
index 269637d..d19fd8a 100644
--- a/src/chart/graph/GraphView.ts
+++ b/src/chart/graph/GraphView.ts
@@ -58,7 +58,7 @@ function getItemOpacity(
     item: GraphNode | GraphEdge,
     opacityPath: typeof nodeOpacityPath | typeof lineOpacityPath
 ): number {
-    let opacity = item.getVisual('opacity');
+    const opacity = item.getVisual('opacity');
     return opacity != null
         ? opacity : item.getModel<any>().get(opacityPath);
 }
@@ -68,7 +68,7 @@ function fadeOutItem(
     opacityPath: typeof nodeOpacityPath | typeof lineOpacityPath,
     opacityRatio?: number
 ) {
-    let el = item.getGraphicEl() as Symbol;   // TODO Symbol?
+    const el = item.getGraphicEl() as Symbol;   // TODO Symbol?
     let opacity = getItemOpacity(item, opacityPath);
 
     if (opacityRatio != null) {
@@ -92,8 +92,8 @@ function fadeInItem(
     item: GraphNode | GraphEdge,
     opacityPath: typeof nodeOpacityPath | typeof lineOpacityPath
 ) {
-    let opacity = getItemOpacity(item, opacityPath);
-    let el = item.getGraphicEl() as Symbol;
+    const opacity = getItemOpacity(item, opacityPath);
+    const el = item.getGraphicEl() as Symbol;
     // Should go back to normal opacity first, consider hoverLayer,
     // where current state is copied to elMirror, and support
     // emphasis opacity here.
@@ -124,9 +124,9 @@ class GraphView extends ChartView {
     private _layouting: boolean;
 
     init(ecModel: GlobalModel, api: ExtensionAPI) {
-        let symbolDraw = new SymbolDraw();
-        let lineDraw = new LineDraw();
-        let group = this.group;
+        const symbolDraw = new SymbolDraw();
+        const lineDraw = new LineDraw();
+        const group = this.group;
 
         this._controller = new RoamController(api.getZr());
         this._controllerHost = {
@@ -143,18 +143,18 @@ class GraphView extends ChartView {
     }
 
     render(seriesModel: GraphSeriesModel, ecModel: GlobalModel, api: ExtensionAPI) {
-        let graphView = this;
-        let coordSys = seriesModel.coordinateSystem;
+        const graphView = this;
+        const coordSys = seriesModel.coordinateSystem;
 
         this._model = seriesModel;
 
-        let symbolDraw = this._symbolDraw;
-        let lineDraw = this._lineDraw;
+        const symbolDraw = this._symbolDraw;
+        const lineDraw = this._lineDraw;
 
-        let group = this.group;
+        const group = this.group;
 
         if (isViewCoordSys(coordSys)) {
-            let groupNewProp = {
+            const groupNewProp = {
                 position: coordSys.position,
                 scale: coordSys.scale
             };
@@ -168,10 +168,10 @@ class GraphView extends ChartView {
         // Fix edge contact point with node
         adjustEdge(seriesModel.getGraph(), getNodeGlobalScale(seriesModel));
 
-        let data = seriesModel.getData();
+        const data = seriesModel.getData();
         symbolDraw.updateData(data);
 
-        let edgeData = seriesModel.getEdgeData();
+        const edgeData = seriesModel.getEdgeData();
         lineDraw.updateData(edgeData);
 
         this._updateNodeAndLinkScale();
@@ -179,17 +179,17 @@ class GraphView extends ChartView {
         this._updateController(seriesModel, ecModel, api);
 
         clearTimeout(this._layoutTimeout);
-        let forceLayout = seriesModel.forceLayout;
-        let layoutAnimation = seriesModel.get(['force', 'layoutAnimation']);
+        const forceLayout = seriesModel.forceLayout;
+        const layoutAnimation = seriesModel.get(['force', 'layoutAnimation']);
         if (forceLayout) {
             this._startForceLayoutIteration(forceLayout, layoutAnimation);
         }
 
         data.eachItemGraphicEl((el: Symbol, idx) => {
-            let itemModel = data.getItemModel(idx) as Model<GraphNodeItemOption>;
+            const itemModel = data.getItemModel(idx) as Model<GraphNodeItemOption>;
             // Update draggable
             el.off('drag').off('dragend');
-            let draggable = itemModel.get('draggable');
+            const draggable = itemModel.get('draggable');
             if (draggable) {
                 el.on('drag', () => {
                     if (forceLayout) {
@@ -228,7 +228,7 @@ class GraphView extends ChartView {
         });
 
         data.graph.eachEdge(function (edge) {
-            let el = edge.getGraphicEl();
+            const el = edge.getGraphicEl();
 
             (el as any)[FOCUS_ADJACENCY] && el.off('mouseover', (el as any)[FOCUS_ADJACENCY]);
             (el as any)[UNFOCUS_ADJACENCY] && el.off('mouseout', (el as any)[UNFOCUS_ADJACENCY]);
@@ -248,25 +248,25 @@ class GraphView extends ChartView {
             }
         });
 
-        let circularRotateLabel = seriesModel.get('layout') === 'circular'
+        const circularRotateLabel = seriesModel.get('layout') === 'circular'
             && seriesModel.get(['circular', 'rotateLabel']);
-        let cx = data.getLayout('cx');
-        let cy = data.getLayout('cy');
+        const cx = data.getLayout('cx');
+        const cy = data.getLayout('cy');
         data.eachItemGraphicEl(function (el: Symbol, idx) {
-            let itemModel = data.getItemModel<GraphNodeItemOption>(idx);
+            const itemModel = data.getItemModel<GraphNodeItemOption>(idx);
             let labelRotate = itemModel.get(['label', 'rotate']) || 0;
-            let symbolPath = el.getSymbolPath();
+            const symbolPath = el.getSymbolPath();
             if (circularRotateLabel) {
-                let pos = data.getItemLayout(idx);
+                const pos = data.getItemLayout(idx);
                 let rad = Math.atan2(pos[1] - cy, pos[0] - cx);
                 if (rad < 0) {
                     rad = Math.PI * 2 + rad;
                 }
-                let isLeft = pos[0] < cx;
+                const isLeft = pos[0] < cx;
                 if (isLeft) {
                     rad = rad - Math.PI;
                 }
-                let textPosition = isLeft ? 'left' as const : 'right' as const;
+                const textPosition = isLeft ? 'left' as const : 'right' as const;
 
                 symbolPath.setTextConfig({
                     rotation: -rad,
@@ -295,7 +295,7 @@ class GraphView extends ChartView {
     }
 
     _dispatchUnfocus(api: ExtensionAPI) {
-        let self = this;
+        const self = this;
         this._clearTimer();
         this._unfocusDelayTimer = setTimeout(function () {
             self._unfocusDelayTimer = null;
@@ -320,13 +320,13 @@ class GraphView extends ChartView {
         api: ExtensionAPI,
         payload: FocusNodePayload
     ) {
-        let data = seriesModel.getData();
-        let graph = data.graph;
-        let dataIndex = payload.dataIndex;
-        let edgeDataIndex = payload.edgeDataIndex;
+        const data = seriesModel.getData();
+        const graph = data.graph;
+        const dataIndex = payload.dataIndex;
+        const edgeDataIndex = payload.edgeDataIndex;
 
-        let node = graph.getNodeByIndex(dataIndex);
-        let edge = graph.getEdgeByIndex(edgeDataIndex);
+        const node = graph.getNodeByIndex(dataIndex);
+        const edge = graph.getEdgeByIndex(edgeDataIndex);
 
         if (!node && !edge) {
             return;
@@ -360,7 +360,7 @@ class GraphView extends ChartView {
     unfocusNodeAdjacency(
         seriesModel: GraphSeriesModel
     ) {
-        let graph = seriesModel.getData().graph;
+        const graph = seriesModel.getData().graph;
 
         graph.eachNode(function (node) {
             fadeOutItem(node, nodeOpacityPath);
@@ -374,7 +374,7 @@ class GraphView extends ChartView {
         forceLayout: GraphSeriesModel['forceLayout'],
         layoutAnimation?: boolean
     ) {
-        let self = this;
+        const self = this;
         (function step() {
             forceLayout.step(function (stopped) {
                 self.updateLayout(self._model);
@@ -392,12 +392,12 @@ class GraphView extends ChartView {
         ecModel: GlobalModel,
         api: ExtensionAPI
     ) {
-        let controller = this._controller;
-        let controllerHost = this._controllerHost;
-        let group = this.group;
+        const controller = this._controller;
+        const controllerHost = this._controllerHost;
+        const group = this.group;
 
         controller.setPointerChecker(function (e, x, y) {
-            let rect = group.getBoundingRect();
+            const rect = group.getBoundingRect();
             rect.applyTransform(group.transform);
             return rect.contain(x, y)
                 && !onIrrelevantElement(e, api, seriesModel);
@@ -439,11 +439,11 @@ class GraphView extends ChartView {
     }
 
     _updateNodeAndLinkScale() {
-        let seriesModel = this._model;
-        let data = seriesModel.getData();
+        const seriesModel = this._model;
+        const data = seriesModel.getData();
 
-        let nodeScale = getNodeGlobalScale(seriesModel);
-        let invScale = [nodeScale, nodeScale];
+        const nodeScale = getNodeGlobalScale(seriesModel);
+        const invScale = [nodeScale, nodeScale];
 
         data.eachItemGraphicEl(function (el, idx) {
             el.attr('scale', invScale);
diff --git a/src/chart/graph/adjustEdge.ts b/src/chart/graph/adjustEdge.ts
index 1186ee2..28243ab 100644
--- a/src/chart/graph/adjustEdge.ts
+++ b/src/chart/graph/adjustEdge.ts
@@ -33,19 +33,19 @@ function intersectCurveCircle(
     center: number[],
     radius: number
 ) {
-    let p0 = curvePoints[0];
-    let p1 = curvePoints[1];
-    let p2 = curvePoints[2];
+    const p0 = curvePoints[0];
+    const p1 = curvePoints[1];
+    const p2 = curvePoints[2];
 
     let d = Infinity;
     let t;
-    let radiusSquare = radius * radius;
+    const radiusSquare = radius * radius;
     let interval = 0.1;
 
     for (let _t = 0.1; _t <= 0.9; _t += 0.1) {
         v1[0] = quadraticAt(p0[0], p1[0], p2[0], _t);
         v1[1] = quadraticAt(p0[1], p1[1], p2[1], _t);
-        let diff = mathAbs(v2DistSquare(v1, center) - radiusSquare);
+        const diff = mathAbs(v2DistSquare(v1, center) - radiusSquare);
         if (diff < d) {
             d = diff;
             t = _t;
@@ -56,7 +56,7 @@ function intersectCurveCircle(
     // At most 32 iteration
     for (let i = 0; i < 32; i++) {
         // let prev = t - interval;
-        let next = t + interval;
+        const next = t + interval;
         // v1[0] = quadraticAt(p0[0], p1[0], p2[0], prev);
         // v1[1] = quadraticAt(p0[1], p1[1], p2[1], prev);
         v2[0] = quadraticAt(p0[0], p1[0], p2[0], t);
@@ -64,13 +64,13 @@ function intersectCurveCircle(
         v3[0] = quadraticAt(p0[0], p1[0], p2[0], next);
         v3[1] = quadraticAt(p0[1], p1[1], p2[1], next);
 
-        let diff = v2DistSquare(v2, center) - radiusSquare;
+        const diff = v2DistSquare(v2, center) - radiusSquare;
         if (mathAbs(diff) < 1e-2) {
             break;
         }
 
         // let prevDiff = v2DistSquare(v1, center) - radiusSquare;
-        let nextDiff = v2DistSquare(v3, center) - radiusSquare;
+        const nextDiff = v2DistSquare(v3, center) - radiusSquare;
 
         interval /= 2;
         if (diff < 0) {
@@ -96,17 +96,17 @@ function intersectCurveCircle(
 
 // Adjust edge to avoid
 export default function (graph: Graph, scale: number) {
-    let tmp0: number[] = [];
-    let quadraticSubdivide = curveTool.quadraticSubdivide;
-    let pts: number[][] = [[], [], []];
-    let pts2: number[][] = [[], []];
-    let v: number[] = [];
+    const tmp0: number[] = [];
+    const quadraticSubdivide = curveTool.quadraticSubdivide;
+    const pts: number[][] = [[], [], []];
+    const pts2: number[][] = [[], []];
+    const v: number[] = [];
     scale /= 2;
 
     graph.eachEdge(function (edge, idx) {
-        let linePoints = edge.getLayout();
-        let fromSymbol = edge.getVisual('fromSymbol');
-        let toSymbol = edge.getVisual('toSymbol');
+        const linePoints = edge.getLayout();
+        const fromSymbol = edge.getVisual('fromSymbol');
+        const toSymbol = edge.getVisual('toSymbol');
 
         if (!linePoints.__original) {
             linePoints.__original = [
@@ -117,16 +117,16 @@ export default function (graph: Graph, scale: number) {
                 linePoints.__original.push(vec2.clone(linePoints[2]));
             }
         }
-        let originalPoints = linePoints.__original;
+        const originalPoints = linePoints.__original;
         // Quadratic curve
         if (linePoints[2] != null) {
             vec2.copy(pts[0], originalPoints[0]);
             vec2.copy(pts[1], originalPoints[2]);
             vec2.copy(pts[2], originalPoints[1]);
             if (fromSymbol && fromSymbol !== 'none') {
-                let symbolSize = getSymbolSize(edge.node1);
+                const symbolSize = getSymbolSize(edge.node1);
 
-                let t = intersectCurveCircle(pts, originalPoints[0], symbolSize * scale);
+                const t = intersectCurveCircle(pts, originalPoints[0], symbolSize * scale);
                 // Subdivide and get the second
                 quadraticSubdivide(pts[0][0], pts[1][0], pts[2][0], t, tmp0);
                 pts[0][0] = tmp0[3];
@@ -136,9 +136,9 @@ export default function (graph: Graph, scale: number) {
                 pts[1][1] = tmp0[4];
             }
             if (toSymbol && toSymbol !== 'none') {
-                let symbolSize = getSymbolSize(edge.node2);
+                const symbolSize = getSymbolSize(edge.node2);
 
-                let t = intersectCurveCircle(pts, originalPoints[1], symbolSize * scale);
+                const t = intersectCurveCircle(pts, originalPoints[1], symbolSize * scale);
                 // Subdivide and get the first
                 quadraticSubdivide(pts[0][0], pts[1][0], pts[2][0], t, tmp0);
                 pts[1][0] = tmp0[1];
@@ -161,12 +161,12 @@ export default function (graph: Graph, scale: number) {
             vec2.normalize(v, v);
             if (fromSymbol && fromSymbol !== 'none') {
 
-                let symbolSize = getSymbolSize(edge.node1);
+                const symbolSize = getSymbolSize(edge.node1);
 
                 vec2.scaleAndAdd(pts2[0], pts2[0], v, symbolSize * scale);
             }
             if (toSymbol && toSymbol !== 'none') {
-                let symbolSize = getSymbolSize(edge.node2);
+                const symbolSize = getSymbolSize(edge.node2);
 
                 vec2.scaleAndAdd(pts2[1], pts2[1], v, -symbolSize * scale);
             }
diff --git a/src/chart/graph/categoryFilter.ts b/src/chart/graph/categoryFilter.ts
index 08916fb..ef477df 100644
--- a/src/chart/graph/categoryFilter.ts
+++ b/src/chart/graph/categoryFilter.ts
@@ -22,21 +22,21 @@ import GraphSeriesModel, { GraphNodeItemOption } from './GraphSeries';
 import type LegendModel from '../../component/legend/LegendModel';
 
 export default function (ecModel: GlobalModel) {
-    let legendModels = ecModel.findComponents({
+    const legendModels = ecModel.findComponents({
         mainType: 'legend'
     }) as LegendModel[];
     if (!legendModels || !legendModels.length) {
         return;
     }
     ecModel.eachSeriesByType('graph', function (graphSeries: GraphSeriesModel) {
-        let categoriesData = graphSeries.getCategoriesData();
-        let graph = graphSeries.getGraph();
-        let data = graph.data;
+        const categoriesData = graphSeries.getCategoriesData();
+        const graph = graphSeries.getGraph();
+        const data = graph.data;
 
-        let categoryNames = categoriesData.mapArray(categoriesData.getName);
+        const categoryNames = categoriesData.mapArray(categoriesData.getName);
 
         data.filterSelf(function (idx) {
-            let model = data.getItemModel<GraphNodeItemOption>(idx);
+            const model = data.getItemModel<GraphNodeItemOption>(idx);
             let category = model.getShallow('category');
             if (category != null) {
                 if (typeof category === 'number') {
diff --git a/src/chart/graph/categoryVisual.ts b/src/chart/graph/categoryVisual.ts
index 330e36c..1775d44 100644
--- a/src/chart/graph/categoryVisual.ts
+++ b/src/chart/graph/categoryVisual.ts
@@ -23,32 +23,32 @@ import { Dictionary, ColorString } from '../../util/types';
 
 export default function (ecModel: GlobalModel) {
 
-    let paletteScope: Dictionary<ColorString> = {};
+    const paletteScope: Dictionary<ColorString> = {};
     ecModel.eachSeriesByType('graph', function (seriesModel: GraphSeriesModel) {
-        let categoriesData = seriesModel.getCategoriesData();
-        let data = seriesModel.getData();
+        const categoriesData = seriesModel.getCategoriesData();
+        const data = seriesModel.getData();
 
-        let categoryNameIdxMap: Dictionary<number> = {};
+        const categoryNameIdxMap: Dictionary<number> = {};
 
         categoriesData.each(function (idx) {
-            let name = categoriesData.getName(idx);
+            const name = categoriesData.getName(idx);
             // Add prefix to avoid conflict with Object.prototype.
             categoryNameIdxMap['ec-' + name] = idx;
-            let itemModel = categoriesData.getItemModel<GraphNodeItemOption>(idx);
+            const itemModel = categoriesData.getItemModel<GraphNodeItemOption>(idx);
 
-            let color = itemModel.get(['itemStyle', 'color'])
+            const color = itemModel.get(['itemStyle', 'color'])
                 || seriesModel.getColorFromPalette(name, paletteScope);
             categoriesData.setItemVisual(idx, 'color', color);
 
-            let opacity = itemModel.get(['itemStyle', 'opacity']);
+            const opacity = itemModel.get(['itemStyle', 'opacity']);
             if (opacity != null) {
                 categoriesData.setItemVisual(idx, 'opacity', opacity);
             }
 
-            let symbolVisualList = ['symbol', 'symbolSize', 'symbolKeepAspect'] as const;
+            const symbolVisualList = ['symbol', 'symbolSize', 'symbolKeepAspect'] as const;
 
             for (let i = 0; i < symbolVisualList.length; i++) {
-                let symbolVisual = itemModel.getShallow(symbolVisualList[i], true);
+                const symbolVisual = itemModel.getShallow(symbolVisualList[i], true);
                 if (symbolVisual != null) {
                     categoriesData.setItemVisual(idx, symbolVisualList[i], symbolVisual);
                 }
@@ -58,14 +58,14 @@ export default function (ecModel: GlobalModel) {
         // Assign category color to visual
         if (categoriesData.count()) {
             data.each(function (idx) {
-                let model = data.getItemModel<GraphNodeItemOption>(idx);
+                const model = data.getItemModel<GraphNodeItemOption>(idx);
                 let category = model.getShallow('category');
                 if (category != null) {
                     if (typeof category === 'string') {
                         category = categoryNameIdxMap['ec-' + category];
                     }
 
-                    let visualList = ['color', 'opacity', 'symbol', 'symbolSize', 'symbolKeepAspect'] as const;
+                    const visualList = ['color', 'opacity', 'symbol', 'symbolSize', 'symbolKeepAspect'] as const;
 
                     for (let i = 0; i < visualList.length; i++) {
                         if (data.getItemVisual(idx, visualList[i], true) == null) {
diff --git a/src/chart/graph/circularLayoutHelper.ts b/src/chart/graph/circularLayoutHelper.ts
index 8dc4b1c..4364763 100644
--- a/src/chart/graph/circularLayoutHelper.ts
+++ b/src/chart/graph/circularLayoutHelper.ts
@@ -51,20 +51,20 @@ export function circularLayout(
     seriesModel: GraphSeriesModel,
     basedOn: 'value' | 'symbolSize'
 ) {
-    let coordSys = seriesModel.coordinateSystem;
+    const coordSys = seriesModel.coordinateSystem;
     if (coordSys && coordSys.type !== 'view') {
         return;
     }
 
-    let rect = coordSys.getBoundingRect();
+    const rect = coordSys.getBoundingRect();
 
-    let nodeData = seriesModel.getData();
-    let graph = nodeData.graph;
+    const nodeData = seriesModel.getData();
+    const graph = nodeData.graph;
 
-    let cx = rect.width / 2 + rect.x;
-    let cy = rect.height / 2 + rect.y;
-    let r = Math.min(rect.width, rect.height) / 2;
-    let count = nodeData.count();
+    const cx = rect.width / 2 + rect.x;
+    const cy = rect.height / 2 + rect.y;
+    const r = Math.min(rect.width, rect.height) / 2;
+    const count = nodeData.count();
 
     nodeData.setLayout({
         cx: cx,
@@ -79,11 +79,11 @@ export function circularLayout(
 
     graph.eachEdge(function (edge) {
         let curveness = edge.getModel<GraphEdgeItemOption>().get(['lineStyle', 'curveness']) || 0;
-        let p1 = vec2.clone(edge.node1.getLayout());
-        let p2 = vec2.clone(edge.node2.getLayout());
+        const p1 = vec2.clone(edge.node1.getLayout());
+        const p2 = vec2.clone(edge.node2.getLayout());
         let cp1;
-        let x12 = (p1[0] + p2[0]) / 2;
-        let y12 = (p1[1] + p2[1]) / 2;
+        const x12 = (p1[0] + p2[0]) / 2;
+        const y12 = (p1[1] + p2[1]) / 2;
         if (+curveness) {
             curveness *= 3;
             cp1 = [
@@ -111,12 +111,12 @@ const _layoutNodesBasedOn: Record<'value' | 'symbolSize', LayoutNode> = {
 
     value(seriesModel, graph, nodeData, r, cx, cy, count) {
         let angle = 0;
-        let sum = nodeData.getSum('value');
-        let unitAngle = Math.PI * 2 / (sum || count);
+        const sum = nodeData.getSum('value');
+        const unitAngle = Math.PI * 2 / (sum || count);
 
         graph.eachNode(function (node) {
-            let value = node.getValue('value') as number;
-            let radianHalf = unitAngle * (sum ? value : 1) / 2;
+            const value = node.getValue('value') as number;
+            const radianHalf = unitAngle * (sum ? value : 1) / 2;
 
             angle += radianHalf;
             node.setLayout([
@@ -131,7 +131,7 @@ const _layoutNodesBasedOn: Record<'value' | 'symbolSize', LayoutNode> = {
         let sumRadian = 0;
         _symbolRadiansHalf.length = count;
 
-        let nodeScale = getNodeGlobalScale(seriesModel);
+        const nodeScale = getNodeGlobalScale(seriesModel);
 
         graph.eachNode(function (node) {
             let symbolSize = getSymbolSize(node);
@@ -150,11 +150,11 @@ const _layoutNodesBasedOn: Record<'value' | 'symbolSize', LayoutNode> = {
             sumRadian += symbolRadianHalf * 2;
         });
 
-        let halfRemainRadian = (2 * PI - sumRadian) / count / 2;
+        const halfRemainRadian = (2 * PI - sumRadian) / count / 2;
 
         let angle = 0;
         graph.eachNode(function (node) {
-            let radianHalf = halfRemainRadian + _symbolRadiansHalf[node.dataIndex];
+            const radianHalf = halfRemainRadian + _symbolRadiansHalf[node.dataIndex];
 
             angle += radianHalf;
             node.setLayout([
diff --git a/src/chart/graph/createView.ts b/src/chart/graph/createView.ts
index 51a942e..213749a 100644
--- a/src/chart/graph/createView.ts
+++ b/src/chart/graph/createView.ts
@@ -27,7 +27,7 @@ import GlobalModel from '../../model/Global';
 import { extend } from 'zrender/src/core/util';
 
 function getViewRect(seriesModel: GraphSeriesModel, api: ExtensionAPI, aspect: number) {
-    let option = extend(seriesModel.getBoxLayoutParams(), {
+    const option = extend(seriesModel.getBoxLayoutParams(), {
         aspect: aspect
     });
     return getLayoutRect(option, {
@@ -37,14 +37,14 @@ function getViewRect(seriesModel: GraphSeriesModel, api: ExtensionAPI, aspect: n
 }
 
 export default function (ecModel: GlobalModel, api: ExtensionAPI) {
-    let viewList: View[] = [];
+    const viewList: View[] = [];
     ecModel.eachSeriesByType('graph', function (seriesModel: GraphSeriesModel) {
-        let coordSysType = seriesModel.get('coordinateSystem');
+        const coordSysType = seriesModel.get('coordinateSystem');
         if (!coordSysType || coordSysType === 'view') {
 
-            let data = seriesModel.getData();
-            let positions = data.mapArray(function (idx) {
-                let itemModel = data.getItemModel<GraphNodeItemOption>(idx);
+            const data = seriesModel.getData();
+            const positions = data.mapArray(function (idx) {
+                const itemModel = data.getItemModel<GraphNodeItemOption>(idx);
                 return [+itemModel.get('x'), +itemModel.get('y')];
             });
 
@@ -62,22 +62,22 @@ export default function (ecModel: GlobalModel, api: ExtensionAPI) {
                 max[1] += 1;
                 min[1] -= 1;
             }
-            let aspect = (max[0] - min[0]) / (max[1] - min[1]);
+            const aspect = (max[0] - min[0]) / (max[1] - min[1]);
             // FIXME If get view rect after data processed?
-            let viewRect = getViewRect(seriesModel, api, aspect);
+            const viewRect = getViewRect(seriesModel, api, aspect);
             // Position may be NaN, use view rect instead
             if (isNaN(aspect)) {
                 min = [viewRect.x, viewRect.y];
                 max = [viewRect.x + viewRect.width, viewRect.y + viewRect.height];
             }
 
-            let bbWidth = max[0] - min[0];
-            let bbHeight = max[1] - min[1];
+            const bbWidth = max[0] - min[0];
+            const bbHeight = max[1] - min[1];
 
-            let viewWidth = viewRect.width;
-            let viewHeight = viewRect.height;
+            const viewWidth = viewRect.width;
+            const viewHeight = viewRect.height;
 
-            let viewCoordSys = seriesModel.coordinateSystem = new View();
+            const viewCoordSys = seriesModel.coordinateSystem = new View();
             viewCoordSys.zoomLimit = seriesModel.get('scaleLimit');
 
             viewCoordSys.setBoundingRect(
diff --git a/src/chart/graph/edgeVisual.ts b/src/chart/graph/edgeVisual.ts
index 8b78149..85b88ba 100644
--- a/src/chart/graph/edgeVisual.ts
+++ b/src/chart/graph/edgeVisual.ts
@@ -29,13 +29,13 @@ function normalize(a: string | number | (string | number)[]): (string | number)[
 
 export default function (ecModel: GlobalModel) {
     ecModel.eachSeriesByType('graph', function (seriesModel: GraphSeriesModel) {
-        let graph = seriesModel.getGraph();
-        let edgeData = seriesModel.getEdgeData();
-        let symbolType = normalize(seriesModel.get('edgeSymbol'));
-        let symbolSize = normalize(seriesModel.get('edgeSymbolSize'));
+        const graph = seriesModel.getGraph();
+        const edgeData = seriesModel.getEdgeData();
+        const symbolType = normalize(seriesModel.get('edgeSymbol'));
+        const symbolSize = normalize(seriesModel.get('edgeSymbolSize'));
 
-        let colorQuery = ['lineStyle', 'color'] as const;
-        let opacityQuery = ['lineStyle', 'opacity'] as const;
+        const colorQuery = ['lineStyle', 'color'] as const;
+        const opacityQuery = ['lineStyle', 'opacity'] as const;
 
         edgeData.setVisual('fromSymbol', symbolType && symbolType[0]);
         edgeData.setVisual('toSymbol', symbolType && symbolType[1]);
@@ -45,13 +45,13 @@ export default function (ecModel: GlobalModel) {
         edgeData.setVisual('opacity', seriesModel.get(opacityQuery));
 
         edgeData.each(function (idx) {
-            let itemModel = edgeData.getItemModel<GraphEdgeItemOption>(idx);
-            let edge = graph.getEdgeByIndex(idx);
-            let symbolType = normalize(itemModel.getShallow('symbol', true));
-            let symbolSize = normalize(itemModel.getShallow('symbolSize', true));
+            const itemModel = edgeData.getItemModel<GraphEdgeItemOption>(idx);
+            const edge = graph.getEdgeByIndex(idx);
+            const symbolType = normalize(itemModel.getShallow('symbol', true));
+            const symbolSize = normalize(itemModel.getShallow('symbolSize', true));
             // Edge visual must after node visual
             let color = itemModel.get(colorQuery);
-            let opacity = itemModel.get(opacityQuery);
+            const opacity = itemModel.get(opacityQuery);
             switch (color) {
                 case 'source':
                     color = edge.node1.getVisual('color');
diff --git a/src/chart/graph/forceHelper.ts b/src/chart/graph/forceHelper.ts
index bf5c983..5e83a9b 100644
--- a/src/chart/graph/forceHelper.ts
+++ b/src/chart/graph/forceHelper.ts
@@ -76,14 +76,14 @@ export function forceLayout<N extends InputNode, E extends InputEdge>(
     inEdges: E[],
     opts: LayoutCfg
 ) {
-    let nodes = inNodes as LayoutNode[];
-    let edges = inEdges as LayoutEdge[];
-    let rect = opts.rect;
-    let width = rect.width;
-    let height = rect.height;
-    let center = [rect.x + width / 2, rect.y + height / 2];
+    const nodes = inNodes as LayoutNode[];
+    const edges = inEdges as LayoutEdge[];
+    const rect = opts.rect;
+    const width = rect.width;
+    const height = rect.height;
+    const center = [rect.x + width / 2, rect.y + height / 2];
     // let scale = opts.scale || 1;
-    let gravity = opts.gravity == null ? 0.1 : opts.gravity;
+    const gravity = opts.gravity == null ? 0.1 : opts.gravity;
 
     // for (let i = 0; i < edges.length; i++) {
     //     let e = edges[i];
@@ -96,7 +96,7 @@ export function forceLayout<N extends InputNode, E extends InputEdge>(
     // }
     // Init position
     for (let i = 0; i < nodes.length; i++) {
-        let n = nodes[i] as LayoutNode;
+        const n = nodes[i] as LayoutNode;
         if (!n.p) {
             n.p = vec2.create(
                 width * (Math.random() - 0.5) + center[0],
@@ -111,7 +111,7 @@ export function forceLayout<N extends InputNode, E extends InputEdge>(
     // let k = scale * Math.sqrt(width * height / nodes.length);
     // let k2 = k * k;
 
-    let initialFriction = opts.friction == null ? 0.6 : opts.friction;
+    const initialFriction = opts.friction == null ? 0.6 : opts.friction;
     let friction = initialFriction;
 
     let beforeStepCallback: (nodes: N[], edges: E[]) => void;
@@ -152,18 +152,18 @@ export function forceLayout<N extends InputNode, E extends InputEdge>(
         step: function (cb?: (finished: boolean) => void) {
             beforeStepCallback && beforeStepCallback(nodes as N[], edges as E[]);
 
-            let v12: number[] = [];
-            let nLen = nodes.length;
+            const v12: number[] = [];
+            const nLen = nodes.length;
             for (let i = 0; i < edges.length; i++) {
-                let e = edges[i];
+                const e = edges[i];
                 if (e.ignoreForceLayout) {
                     continue;
                 }
-                let n1 = e.n1;
-                let n2 = e.n2;
+                const n1 = e.n1;
+                const n2 = e.n2;
 
                 vec2.sub(v12, n2.p, n1.p);
-                let d = vec2.len(v12) - e.d;
+                const d = vec2.len(v12) - e.d;
                 let w = n2.w / (n1.w + n2.w);
 
                 if (isNaN(w)) {
@@ -177,7 +177,7 @@ export function forceLayout<N extends InputNode, E extends InputEdge>(
             }
             // Gravity
             for (let i = 0; i < nLen; i++) {
-                let n = nodes[i];
+                const n = nodes[i];
                 if (!n.fixed) {
                     vec2.sub(v12, center, n.p);
                     // let d = vec2.len(v12);
@@ -190,9 +190,9 @@ export function forceLayout<N extends InputNode, E extends InputEdge>(
             // Repulsive
             // PENDING
             for (let i = 0; i < nLen; i++) {
-                let n1 = nodes[i];
+                const n1 = nodes[i];
                 for (let j = i + 1; j < nLen; j++) {
-                    let n2 = nodes[j];
+                    const n2 = nodes[j];
                     vec2.sub(v12, n2.p, n1.p);
                     let d = vec2.len(v12);
                     if (d === 0) {
@@ -200,14 +200,14 @@ export function forceLayout<N extends InputNode, E extends InputEdge>(
                         vec2.set(v12, Math.random() - 0.5, Math.random() - 0.5);
                         d = 1;
                     }
-                    let repFact = (n1.rep + n2.rep) / d / d;
+                    const repFact = (n1.rep + n2.rep) / d / d;
                     !n1.fixed && scaleAndAdd(n1.pp, n1.pp, v12, repFact);
                     !n2.fixed && scaleAndAdd(n2.pp, n2.pp, v12, -repFact);
                 }
             }
-            let v: number[] = [];
+            const v: number[] = [];
             for (let i = 0; i < nLen; i++) {
-                let n = nodes[i];
+                const n = nodes[i];
                 if (!n.fixed) {
                     vec2.sub(v, n.p, n.pp);
                     scaleAndAdd(n.p, n.p, v, friction);
diff --git a/src/chart/graph/forceLayout.ts b/src/chart/graph/forceLayout.ts
index e592821..1fbbed8 100644
--- a/src/chart/graph/forceLayout.ts
+++ b/src/chart/graph/forceLayout.ts
@@ -41,15 +41,15 @@ export default function (ecModel: GlobalModel) {
             return;
         }
         if (graphSeries.get('layout') === 'force') {
-            let preservedPoints = graphSeries.preservedPoints || {};
-            let graph = graphSeries.getGraph();
-            let nodeData = graph.data;
-            let edgeData = graph.edgeData;
-            let forceModel = graphSeries.getModel('force');
-            let initLayout = forceModel.get('initLayout');
+            const preservedPoints = graphSeries.preservedPoints || {};
+            const graph = graphSeries.getGraph();
+            const nodeData = graph.data;
+            const edgeData = graph.edgeData;
+            const forceModel = graphSeries.getModel('force');
+            const initLayout = forceModel.get('initLayout');
             if (graphSeries.preservedPoints) {
                 nodeData.each(function (idx) {
-                    let id = nodeData.getId(idx);
+                    const id = nodeData.getId(idx);
                     nodeData.setItemLayout(idx, preservedPoints[id] || [NaN, NaN]);
                 });
             }
@@ -60,12 +60,12 @@ export default function (ecModel: GlobalModel) {
                 circularLayout(graphSeries, 'value');
             }
 
-            let nodeDataExtent = nodeData.getDataExtent('value');
-            let edgeDataExtent = edgeData.getDataExtent('value');
+            const nodeDataExtent = nodeData.getDataExtent('value');
+            const edgeDataExtent = edgeData.getDataExtent('value');
             // let edgeDataExtent = edgeData.getDataExtent('value');
-            let repulsion = forceModel.get('repulsion');
-            let edgeLength = forceModel.get('edgeLength');
-            let repulsionArr = zrUtil.isArray(repulsion)
+            const repulsion = forceModel.get('repulsion');
+            const edgeLength = forceModel.get('edgeLength');
+            const repulsionArr = zrUtil.isArray(repulsion)
                 ? repulsion : [repulsion, repulsion];
             let edgeLengthArr = zrUtil.isArray(edgeLength)
                 ? edgeLength : [edgeLength, edgeLength];
@@ -73,8 +73,8 @@ export default function (ecModel: GlobalModel) {
             // Larger value has smaller length
             edgeLengthArr = [edgeLengthArr[1], edgeLengthArr[0]];
 
-            let nodes = nodeData.mapArray('value', function (value: number, idx) {
-                let point = nodeData.getItemLayout(idx) as number[];
+            const nodes = nodeData.mapArray('value', function (value: number, idx) {
+                const point = nodeData.getItemLayout(idx) as number[];
                 let rep = linearMap(value, nodeDataExtent, repulsionArr);
                 if (isNaN(rep)) {
                     rep = (repulsionArr[0] + repulsionArr[1]) / 2;
@@ -86,13 +86,13 @@ export default function (ecModel: GlobalModel) {
                     p: (!point || isNaN(point[0]) || isNaN(point[1])) ? null : point
                 };
             });
-            let edges = edgeData.mapArray('value', function (value: number, idx) {
-                let edge = graph.getEdgeByIndex(idx);
+            const edges = edgeData.mapArray('value', function (value: number, idx) {
+                const edge = graph.getEdgeByIndex(idx);
                 let d = linearMap(value, edgeDataExtent, edgeLengthArr);
                 if (isNaN(d)) {
                     d = (edgeLengthArr[0] + edgeLengthArr[1]) / 2;
                 }
-                let edgeModel = edge.getModel<GraphEdgeItemOption>();
+                const edgeModel = edge.getModel<GraphEdgeItemOption>();
                 return {
                     n1: nodes[edge.node1.dataIndex],
                     n2: nodes[edge.node2.dataIndex],
@@ -103,8 +103,8 @@ export default function (ecModel: GlobalModel) {
             });
 
             // let coordSys = graphSeries.coordinateSystem;
-            let rect = coordSys.getBoundingRect();
-            let forceInstance = forceLayout(nodes, edges, {
+            const rect = coordSys.getBoundingRect();
+            const forceInstance = forceLayout(nodes, edges, {
                 rect: rect,
                 gravity: forceModel.get('gravity'),
                 friction: forceModel.get('friction')
@@ -128,10 +128,10 @@ export default function (ecModel: GlobalModel) {
                     preservedPoints[nodeData.getId(i)] = nodes[i].p;
                 }
                 for (let i = 0, l = edges.length; i < l; i++) {
-                    let e = edges[i];
-                    let edge = graph.getEdgeByIndex(i);
-                    let p1 = e.n1.p;
-                    let p2 = e.n2.p;
+                    const e = edges[i];
+                    const edge = graph.getEdgeByIndex(i);
+                    const p1 = e.n1.p;
+                    const p2 = e.n2.p;
                     let points = edge.getLayout() as number[][];
                     points = points ? points.slice() : [];
                     points[0] = points[0] || [];
diff --git a/src/chart/graph/graphAction.ts b/src/chart/graph/graphAction.ts
index d05e716..87350dc 100644
--- a/src/chart/graph/graphAction.ts
+++ b/src/chart/graph/graphAction.ts
@@ -43,9 +43,9 @@ echarts.registerAction(actionInfo, function (payload: RoamPaylod, ecModel: Globa
     ecModel.eachComponent({
         mainType: 'series', query: payload
     }, function (seriesModel: GraphSeriesModel) {
-        let coordSys = seriesModel.coordinateSystem as View;
+        const coordSys = seriesModel.coordinateSystem as View;
 
-        let res = updateCenterAndZoom(coordSys, payload);
+        const res = updateCenterAndZoom(coordSys, payload);
 
         seriesModel.setCenter
             && seriesModel.setCenter(res.center);
diff --git a/src/chart/graph/graphHelper.ts b/src/chart/graph/graphHelper.ts
index 39dd954..362ce9d 100644
--- a/src/chart/graph/graphHelper.ts
+++ b/src/chart/graph/graphHelper.ts
@@ -22,18 +22,18 @@ import View from '../../coord/View';
 import { GraphNode } from '../../data/Graph';
 
 export function getNodeGlobalScale(seriesModel: GraphSeriesModel) {
-    let coordSys = seriesModel.coordinateSystem as View;
+    const coordSys = seriesModel.coordinateSystem as View;
     if (coordSys.type !== 'view') {
         return 1;
     }
 
-    let nodeScaleRatio = seriesModel.option.nodeScaleRatio;
+    const nodeScaleRatio = seriesModel.option.nodeScaleRatio;
 
-    let groupScale = coordSys.scale;
-    let groupZoom = (groupScale && groupScale[0]) || 1;
+    const groupScale = coordSys.scale;
+    const groupZoom = (groupScale && groupScale[0]) || 1;
     // Scale node when zoom changes
-    let roamZoom = coordSys.getZoom();
-    let nodeScale = (roamZoom - 1) * nodeScaleRatio + 1;
+    const roamZoom = coordSys.getZoom();
+    const nodeScale = (roamZoom - 1) * nodeScaleRatio + 1;
 
     return nodeScale / groupZoom;
 }
diff --git a/src/chart/graph/simpleLayout.ts b/src/chart/graph/simpleLayout.ts
index 4c83925..d947f96 100644
--- a/src/chart/graph/simpleLayout.ts
+++ b/src/chart/graph/simpleLayout.ts
@@ -25,10 +25,10 @@ import GraphSeriesModel from './GraphSeries';
 
 export default function (ecModel: GlobalModel, api: ExtensionAPI) {
     ecModel.eachSeriesByType('graph', function (seriesModel: GraphSeriesModel) {
-        let layout = seriesModel.get('layout');
-        let coordSys = seriesModel.coordinateSystem;
+        const layout = seriesModel.get('layout');
+        const coordSys = seriesModel.coordinateSystem;
         if (coordSys && coordSys.type !== 'view') {
-            let data = seriesModel.getData();
+            const data = seriesModel.getData();
 
             let dimensions: string[] = [];
             each(coordSys.dimensions, function (coordDim) {
@@ -36,10 +36,10 @@ export default function (ecModel: GlobalModel, api: ExtensionAPI) {
             });
 
             for (let dataIndex = 0; dataIndex < data.count(); dataIndex++) {
-                let value = [];
+                const value = [];
                 let hasValue = false;
                 for (let i = 0; i < dimensions.length; i++) {
-                    let val = data.get(dimensions[i], dataIndex) as number;
+                    const val = data.get(dimensions[i], dataIndex) as number;
                     if (!isNaN(val)) {
                         hasValue = true;
                     }
diff --git a/src/chart/graph/simpleLayoutHelper.ts b/src/chart/graph/simpleLayoutHelper.ts
index d00fbb7..723f153 100644
--- a/src/chart/graph/simpleLayoutHelper.ts
+++ b/src/chart/graph/simpleLayoutHelper.ts
@@ -22,14 +22,14 @@ import GraphSeriesModel, { GraphNodeItemOption, GraphEdgeItemOption } from './Gr
 import Graph from '../../data/Graph';
 
 export function simpleLayout(seriesModel: GraphSeriesModel) {
-    let coordSys = seriesModel.coordinateSystem;
+    const coordSys = seriesModel.coordinateSystem;
     if (coordSys && coordSys.type !== 'view') {
         return;
     }
-    let graph = seriesModel.getGraph();
+    const graph = seriesModel.getGraph();
 
     graph.eachNode(function (node) {
-        let model = node.getModel<GraphNodeItemOption>();
+        const model = node.getModel<GraphNodeItemOption>();
         node.setLayout([+model.get('x'), +model.get('y')]);
     });
 
@@ -38,10 +38,10 @@ export function simpleLayout(seriesModel: GraphSeriesModel) {
 
 export function simpleLayoutEdge(graph: Graph) {
     graph.eachEdge(function (edge, idx) {
-        let curveness = edge.getModel<GraphEdgeItemOption>().get(['lineStyle', 'curveness']) || 0;
-        let p1 = vec2.clone(edge.node1.getLayout());
-        let p2 = vec2.clone(edge.node2.getLayout());
-        let points = [p1, p2];
+        const curveness = edge.getModel<GraphEdgeItemOption>().get(['lineStyle', 'curveness']) || 0;
+        const p1 = vec2.clone(edge.node1.getLayout());
+        const p2 = vec2.clone(edge.node2.getLayout());
+        const points = [p1, p2];
         if (+curveness) {
             points.push([
                 (p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * curveness,
diff --git a/src/chart/heatmap/HeatmapLayer.ts b/src/chart/heatmap/HeatmapLayer.ts
index 62e842e..f851301 100644
--- a/src/chart/heatmap/HeatmapLayer.ts
+++ b/src/chart/heatmap/HeatmapLayer.ts
@@ -43,7 +43,7 @@ class HeatmapLayer {
     };
 
     constructor() {
-        let canvas = zrUtil.createCanvas();
+        const canvas = zrUtil.createCanvas();
         this.canvas = canvas;
     }
 
@@ -61,24 +61,24 @@ class HeatmapLayer {
         colorFunc: Record<ColorState, ColorFunc>,
         isInRange?: (grad?: number) => boolean
     ) {
-        let brush = this._getBrush();
-        let gradientInRange = this._getGradient(colorFunc, 'inRange');
-        let gradientOutOfRange = this._getGradient(colorFunc, 'outOfRange');
-        let r = this.pointSize + this.blurSize;
-
-        let canvas = this.canvas;
-        let ctx = canvas.getContext('2d');
-        let len = data.length;
+        const brush = this._getBrush();
+        const gradientInRange = this._getGradient(colorFunc, 'inRange');
+        const gradientOutOfRange = this._getGradient(colorFunc, 'outOfRange');
+        const r = this.pointSize + this.blurSize;
+
+        const canvas = this.canvas;
+        const ctx = canvas.getContext('2d');
+        const len = data.length;
         canvas.width = width;
         canvas.height = height;
         for (let i = 0; i < len; ++i) {
-            let p = data[i];
-            let x = p[0];
-            let y = p[1];
-            let value = p[2];
+            const p = data[i];
+            const x = p[0];
+            const y = p[1];
+            const value = p[2];
 
             // calculate alpha using value
-            let alpha = normalize(value);
+            const alpha = normalize(value);
 
             // draw with the circle brush with alpha
             ctx.globalAlpha = alpha;
@@ -92,21 +92,21 @@ class HeatmapLayer {
         }
 
         // colorize the canvas using alpha value and set with gradient
-        let imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
+        const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
 
-        let pixels = imageData.data;
+        const pixels = imageData.data;
         let offset = 0;
-        let pixelLen = pixels.length;
-        let minOpacity = this.minOpacity;
-        let maxOpacity = this.maxOpacity;
-        let diffOpacity = maxOpacity - minOpacity;
+        const pixelLen = pixels.length;
+        const minOpacity = this.minOpacity;
+        const maxOpacity = this.maxOpacity;
+        const diffOpacity = maxOpacity - minOpacity;
 
         while (offset < pixelLen) {
             let alpha = pixels[offset + 3] / 256;
-            let gradientOffset = Math.floor(alpha * (GRADIENT_LEVELS - 1)) * 4;
+            const gradientOffset = Math.floor(alpha * (GRADIENT_LEVELS - 1)) * 4;
             // Simple optimize to ignore the empty data
             if (alpha > 0) {
-                let gradient = isInRange(alpha) ? gradientInRange : gradientOutOfRange;
+                const gradient = isInRange(alpha) ? gradientInRange : gradientOutOfRange;
                 // Any alpha > 0 will be mapped to [minOpacity, maxOpacity]
                 alpha > 0 && (alpha = alpha * diffOpacity + minOpacity);
                 pixels[offset++] = gradient[gradientOffset];
@@ -127,14 +127,14 @@ class HeatmapLayer {
      * get canvas of a black circle brush used for canvas to draw later
      */
     _getBrush() {
-        let brushCanvas = this._brushCanvas || (this._brushCanvas = zrUtil.createCanvas());
+        const brushCanvas = this._brushCanvas || (this._brushCanvas = zrUtil.createCanvas());
         // set brush size
-        let r = this.pointSize + this.blurSize;
-        let d = r * 2;
+        const r = this.pointSize + this.blurSize;
+        const d = r * 2;
         brushCanvas.width = d;
         brushCanvas.height = d;
 
-        let ctx = brushCanvas.getContext('2d');
+        const ctx = brushCanvas.getContext('2d');
         ctx.clearRect(0, 0, d, d);
 
         // in order to render shadow without the distinct circle,
@@ -159,9 +159,9 @@ class HeatmapLayer {
      * @private
      */
     _getGradient(colorFunc: Record<ColorState, ColorFunc>, state: ColorState) {
-        let gradientPixels = this._gradientPixels;
-        let pixelsSingleState = gradientPixels[state] || (gradientPixels[state] = new Uint8ClampedArray(256 * 4));
-        let color = [0, 0, 0, 0];
+        const gradientPixels = this._gradientPixels;
+        const pixelsSingleState = gradientPixels[state] || (gradientPixels[state] = new Uint8ClampedArray(256 * 4));
+        const color = [0, 0, 0, 0];
         let off = 0;
         for (let i = 0; i < 256; i++) {
             colorFunc[state](i / 255, true, color);
diff --git a/src/chart/heatmap/HeatmapSeries.ts b/src/chart/heatmap/HeatmapSeries.ts
index 8123877..0cfe55f 100644
--- a/src/chart/heatmap/HeatmapSeries.ts
+++ b/src/chart/heatmap/HeatmapSeries.ts
@@ -87,7 +87,7 @@ class HeatmapSeriesModel extends SeriesModel<HeatmapSeriesOption> {
     }
 
     preventIncremental() {
-        let coordSysCreator = CoordinateSystem.get(this.get('coordinateSystem'));
+        const coordSysCreator = CoordinateSystem.get(this.get('coordinateSystem'));
         if (coordSysCreator && coordSysCreator.dimensions) {
             return coordSysCreator.dimensions[0] === 'lng' && coordSysCreator.dimensions[1] === 'lat';
         }
diff --git a/src/chart/heatmap/HeatmapView.ts b/src/chart/heatmap/HeatmapView.ts
index cd11208..ed96906 100644
--- a/src/chart/heatmap/HeatmapView.ts
+++ b/src/chart/heatmap/HeatmapView.ts
@@ -44,7 +44,7 @@ function getIsInPiecewiseRange(
     pieceList: ReturnType<PiecewiseModel['getPieceList']>,
     selected: Dictionary<boolean>
 ) {
-    let dataSpan = dataExtent[1] - dataExtent[0];
+    const dataSpan = dataExtent[1] - dataExtent[0];
     pieceList = zrUtil.map(pieceList, function (piece) {
         return {
             interval: [
@@ -53,14 +53,14 @@ function getIsInPiecewiseRange(
             ]
         };
     });
-    let len = pieceList.length;
+    const len = pieceList.length;
     let lastIndex = 0;
 
     return function (val: number) {
         let i;
         // Try to find in the location of the last found
         for (i = lastIndex; i < len; i++) {
-            let interval = pieceList[i].interval;
+            const interval = pieceList[i].interval;
             if (interval[0] <= val && val <= interval[1]) {
                 lastIndex = i;
                 break;
@@ -68,7 +68,7 @@ function getIsInPiecewiseRange(
         }
         if (i === len) { // Not found, back interation
             for (i = lastIndex - 1; i >= 0; i--) {
-                let interval = pieceList[i].interval;
+                const interval = pieceList[i].interval;
                 if (interval[0] <= val && val <= interval[1]) {
                     lastIndex = i;
                     break;
@@ -80,7 +80,7 @@ function getIsInPiecewiseRange(
 }
 
 function getIsInContinuousRange(dataExtent: number[], range: number[]) {
-    let dataSpan = dataExtent[1] - dataExtent[0];
+    const dataSpan = dataExtent[1] - dataExtent[0];
     range = [
         (range[0] - dataExtent[0]) / dataSpan,
         (range[1] - dataExtent[0]) / dataSpan
@@ -91,7 +91,7 @@ function getIsInContinuousRange(dataExtent: number[], range: number[]) {
 }
 
 function isGeoCoordSys(coordSys: CoordinateSystem): coordSys is GeoLikeCoordSys {
-    let dimensions = coordSys.dimensions;
+    const dimensions = coordSys.dimensions;
     // Not use coorSys.type === 'geo' because coordSys maybe extended
     return dimensions[0] === 'lng' && dimensions[1] === 'lat';
 }
@@ -125,7 +125,7 @@ class HeatmapView extends ChartView {
 
         this._incrementalDisplayable = null;
 
-        let coordSys = seriesModel.coordinateSystem;
+        const coordSys = seriesModel.coordinateSystem;
         if (coordSys.type === 'cartesian2d' || coordSys.type === 'calendar') {
             this._renderOnCartesianAndCalendar(seriesModel, api, 0, seriesModel.getData().count());
         }
@@ -146,7 +146,7 @@ class HeatmapView extends ChartView {
         ecModel: GlobalModel,
         api: ExtensionAPI
     ) {
-        let coordSys = seriesModel.coordinateSystem;
+        const coordSys = seriesModel.coordinateSystem;
         if (coordSys) {
             this._renderOnCartesianAndCalendar(seriesModel, api, params.start, params.end, true);
         }
@@ -160,13 +160,13 @@ class HeatmapView extends ChartView {
         incremental?: boolean
     ) {
 
-        let coordSys = seriesModel.coordinateSystem as Cartesian2D | Calendar;
+        const coordSys = seriesModel.coordinateSystem as Cartesian2D | Calendar;
         let width;
         let height;
 
         if (isCoordinateSystemType<Cartesian2D>(coordSys, 'cartesian2d')) {
-            let xAxis = coordSys.getAxis('x');
-            let yAxis = coordSys.getAxis('y');
+            const xAxis = coordSys.getAxis('x');
+            const yAxis = coordSys.getAxis('y');
 
             if (__DEV__) {
                 if (!(xAxis.type === 'category' && yAxis.type === 'category')) {
@@ -181,15 +181,15 @@ class HeatmapView extends ChartView {
             height = yAxis.getBandWidth();
         }
 
-        let group = this.group;
-        let data = seriesModel.getData();
+        const group = this.group;
+        const data = seriesModel.getData();
 
         let style = seriesModel.getModel('itemStyle').getItemStyle(['color']);
         let hoverStl = seriesModel.getModel(['emphasis', 'itemStyle']).getItemStyle();
         let labelModel = seriesModel.getModel('label');
         let hoverLabelModel = seriesModel.getModel(['emphasis', 'label']);
 
-        let dataDims = isCoordinateSystemType<Cartesian2D>(coordSys, 'cartesian2d')
+        const dataDims = isCoordinateSystemType<Cartesian2D>(coordSys, 'cartesian2d')
             ? [
                 data.mapDimension('x'),
                 data.mapDimension('y'),
@@ -209,7 +209,7 @@ class HeatmapView extends ChartView {
                     continue;
                 }
 
-                let point = coordSys.dataToPoint([
+                const point = coordSys.dataToPoint([
                     data.get(dataDims[0], idx),
                     data.get(dataDims[1], idx)
                 ]);
@@ -243,7 +243,7 @@ class HeatmapView extends ChartView {
                 });
             }
 
-            let itemModel = data.getItemModel<HeatmapDataItemOption>(idx);
+            const itemModel = data.getItemModel<HeatmapDataItemOption>(idx);
 
             // Optimization for large datset
             if (data.hasItemOption) {
@@ -253,7 +253,7 @@ class HeatmapView extends ChartView {
                 hoverLabelModel = itemModel.getModel(['emphasis', 'label']);
             }
 
-            let rawValue = seriesModel.getRawValue(idx) as OptionDataValue[];
+            const rawValue = seriesModel.getRawValue(idx) as OptionDataValue[];
             let defaultText = '-';
             if (rawValue && rawValue[2] != null) {
                 defaultText = rawValue[2] + '';
@@ -289,47 +289,47 @@ class HeatmapView extends ChartView {
         visualMapModel: VisualMapModel,
         api: ExtensionAPI
     ) {
-        let inRangeVisuals = visualMapModel.targetVisuals.inRange;
-        let outOfRangeVisuals = visualMapModel.targetVisuals.outOfRange;
+        const inRangeVisuals = visualMapModel.targetVisuals.inRange;
+        const outOfRangeVisuals = visualMapModel.targetVisuals.outOfRange;
         // if (!visualMapping) {
         //     throw new Error('Data range must have color visuals');
         // }
 
-        let data = seriesModel.getData();
-        let hmLayer = this._hmLayer || (this._hmLayer || new HeatmapLayer());
+        const data = seriesModel.getData();
+        const hmLayer = this._hmLayer || (this._hmLayer || new HeatmapLayer());
         hmLayer.blurSize = seriesModel.get('blurSize');
         hmLayer.pointSize = seriesModel.get('pointSize');
         hmLayer.minOpacity = seriesModel.get('minOpacity');
         hmLayer.maxOpacity = seriesModel.get('maxOpacity');
 
-        let rect = geo.getViewRect().clone();
-        let roamTransform = geo.getRoamTransform();
+        const rect = geo.getViewRect().clone();
+        const roamTransform = geo.getRoamTransform();
         rect.applyTransform(roamTransform);
 
         // Clamp on viewport
-        let x = Math.max(rect.x, 0);
-        let y = Math.max(rect.y, 0);
-        let x2 = Math.min(rect.width + rect.x, api.getWidth());
-        let y2 = Math.min(rect.height + rect.y, api.getHeight());
-        let width = x2 - x;
-        let height = y2 - y;
-
-        let dims = [
+        const x = Math.max(rect.x, 0);
+        const y = Math.max(rect.y, 0);
+        const x2 = Math.min(rect.width + rect.x, api.getWidth());
+        const y2 = Math.min(rect.height + rect.y, api.getHeight());
+        const width = x2 - x;
+        const height = y2 - y;
+
+        const dims = [
             data.mapDimension('lng'),
             data.mapDimension('lat'),
             data.mapDimension('value')
         ];
 
-        let points = data.mapArray(dims, function (lng: number, lat: number, value: number) {
-            let pt = geo.dataToPoint([lng, lat]);
+        const points = data.mapArray(dims, function (lng: number, lat: number, value: number) {
+            const pt = geo.dataToPoint([lng, lat]);
             pt[0] -= x;
             pt[1] -= y;
             pt.push(value);
             return pt;
         });
 
-        let dataExtent = visualMapModel.getExtent();
-        let isInRange = visualMapModel.type === 'visualMap.continuous'
+        const dataExtent = visualMapModel.getExtent();
+        const isInRange = visualMapModel.type === 'visualMap.continuous'
             ? getIsInContinuousRange(dataExtent, (visualMapModel as ContinuousModel).option.range)
             : getIsInPiecewiseRange(
                 dataExtent,
@@ -346,7 +346,7 @@ class HeatmapView extends ChartView {
             },
             isInRange
         );
-        let img = new graphic.Image({
+        const img = new graphic.Image({
             style: {
                 width: width,
                 height: height,
diff --git a/src/chart/helper/EffectLine.ts b/src/chart/helper/EffectLine.ts
index 81b758c..65e555f 100644
--- a/src/chart/helper/EffectLine.ts
+++ b/src/chart/helper/EffectLine.ts
@@ -60,14 +60,14 @@ class EffectLine extends graphic.Group {
     }
 
     _updateEffectSymbol(lineData: List, idx: number) {
-        let itemModel = lineData.getItemModel<LineDrawModelOption>(idx);
-        let effectModel = itemModel.getModel('effect');
+        const itemModel = lineData.getItemModel<LineDrawModelOption>(idx);
+        const effectModel = itemModel.getModel('effect');
         let size = effectModel.get('symbolSize');
-        let symbolType = effectModel.get('symbol');
+        const symbolType = effectModel.get('symbol');
         if (!zrUtil.isArray(size)) {
             size = [size, size];
         }
-        let color = effectModel.get('color') || lineData.getItemVisual(idx, 'color');
+        const color = effectModel.get('color') || lineData.getItemVisual(idx, 'color');
         let symbol = this.childAt(1) as ECSymbolOnEffectLine;
 
         if (this._symbolType !== symbolType) {
@@ -109,19 +109,19 @@ class EffectLine extends graphic.Group {
         idx: number
     ) {
 
-        let symbol = this.childAt(1) as ECSymbolOnEffectLine;
+        const symbol = this.childAt(1) as ECSymbolOnEffectLine;
         if (!symbol) {
             return;
         }
 
-        let self = this;
+        const self = this;
 
-        let points = lineData.getItemLayout(idx);
+        const points = lineData.getItemLayout(idx);
 
         let period = effectModel.get('period') * 1000;
-        let loop = effectModel.get('loop');
-        let constantSpeed = effectModel.get('constantSpeed');
-        let delayExpr = zrUtil.retrieve(effectModel.get('delay'), function (idx) {
+        const loop = effectModel.get('loop');
+        const constantSpeed = effectModel.get('constantSpeed');
+        const delayExpr = zrUtil.retrieve(effectModel.get('delay'), function (idx) {
             return idx / lineData.count() * period / 3;
         });
 
@@ -149,7 +149,7 @@ class EffectLine extends graphic.Group {
                 delayNum = -period * symbol.__t;
             }
             symbol.__t = 0;
-            let animator = symbol.animate('', loop)
+            const animator = symbol.animate('', loop)
                 .when(period, {
                     __t: 1
                 })
@@ -190,26 +190,26 @@ class EffectLine extends graphic.Group {
     }
 
     updateSymbolPosition(symbol: ECSymbolOnEffectLine) {
-        let p1 = symbol.__p1;
-        let p2 = symbol.__p2;
-        let cp1 = symbol.__cp1;
-        let t = symbol.__t;
-        let pos = symbol.position;
-        let lastPos = [pos[0], pos[1]];
-        let quadraticAt = curveUtil.quadraticAt;
-        let quadraticDerivativeAt = curveUtil.quadraticDerivativeAt;
+        const p1 = symbol.__p1;
+        const p2 = symbol.__p2;
+        const cp1 = symbol.__cp1;
+        const t = symbol.__t;
+        const pos = symbol.position;
+        const lastPos = [pos[0], pos[1]];
+        const quadraticAt = curveUtil.quadraticAt;
+        const quadraticDerivativeAt = curveUtil.quadraticDerivativeAt;
         pos[0] = quadraticAt(p1[0], cp1[0], p2[0], t);
         pos[1] = quadraticAt(p1[1], cp1[1], p2[1], t);
 
         // Tangent
-        let tx = quadraticDerivativeAt(p1[0], cp1[0], p2[0], t);
-        let ty = quadraticDerivativeAt(p1[1], cp1[1], p2[1], t);
+        const tx = quadraticDerivativeAt(p1[0], cp1[0], p2[0], t);
+        const ty = quadraticDerivativeAt(p1[1], cp1[1], p2[1], t);
 
         symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2;
         // enable continuity trail for 'line', 'rect', 'roundRect' symbolType
         if (this._symbolType === 'line' || this._symbolType === 'rect' || this._symbolType === 'roundRect') {
             if (symbol.__lastT !== undefined && symbol.__lastT < symbol.__t) {
-                let scaleY = vec2.dist(lastPos, pos) * 1.05;
+                const scaleY = vec2.dist(lastPos, pos) * 1.05;
                 symbol.attr('scale', [symbol.scale[0], scaleY]);
                 // make sure the last segment render within endPoint
                 if (t === 1) {
@@ -219,7 +219,7 @@ class EffectLine extends graphic.Group {
             }
             else if (symbol.__lastT === 1) {
                 // After first loop, symbol.__t does NOT start with 0, so connect p1 to pos directly.
-                let scaleY = 2 * vec2.dist(p1, pos);
+                const scaleY = 2 * vec2.dist(p1, pos);
                 symbol.attr('scale', [symbol.scale[0], scaleY ]);
             }
             else {
@@ -234,7 +234,7 @@ class EffectLine extends graphic.Group {
     updateLayout(lineData: List, idx: number) {
         (this.childAt(0) as Line).updateLayout(lineData, idx);
 
-        let effectModel = lineData.getItemModel<LineDrawModelOption>(idx).getModel('effect');
+        const effectModel = lineData.getItemModel<LineDrawModelOption>(idx).getModel('effect');
         this._updateEffectAnimation(lineData, effectModel, idx);
     }
 }
diff --git a/src/chart/helper/EffectPolyline.ts b/src/chart/helper/EffectPolyline.ts
index c31dae4..11ad927 100644
--- a/src/chart/helper/EffectPolyline.ts
+++ b/src/chart/helper/EffectPolyline.ts
@@ -40,11 +40,11 @@ class EffectPolyline extends EffectLine {
     // Override
     protected updateAnimationPoints(symbol: ECSymbolOnEffectLine, points: number[][]) {
         this._points = points;
-        let accLenArr = [0];
+        const accLenArr = [0];
         let len = 0;
         for (let i = 1; i < points.length; i++) {
-            let p1 = points[i - 1];
-            let p2 = points[i];
+            const p1 = points[i - 1];
+            const p2 = points[i];
             len += vec2.dist(p1, p2);
             accLenArr.push(len);
         }
@@ -66,23 +66,23 @@ class EffectPolyline extends EffectLine {
 
     // Override
     updateSymbolPosition(symbol: ECSymbolOnEffectLine) {
-        let t = symbol.__t;
-        let points = this._points;
-        let offsets = this._offsets;
-        let len = points.length;
+        const t = symbol.__t;
+        const points = this._points;
+        const offsets = this._offsets;
+        const len = points.length;
 
         if (!offsets) {
             // Has length 0
             return;
         }
 
-        let lastFrame = this._lastFrame;
+        const lastFrame = this._lastFrame;
         let frame: number;
 
         if (t < this._lastFramePercent) {
             // Start from the next frame
             // PENDING start from lastFrame ?
-            let start = Math.min(lastFrame + 1, len - 1);
+            const start = Math.min(lastFrame + 1, len - 1);
             for (frame = start; frame >= 0; frame--) {
                 if (offsets[frame] <= t) {
                     break;
@@ -105,8 +105,8 @@ class EffectPolyline extends EffectLine {
             (t - offsets[frame]) / (offsets[frame + 1] - offsets[frame])
         );
 
-        let tx = points[frame + 1][0] - points[frame][0];
-        let ty = points[frame + 1][1] - points[frame][1];
+        const tx = points[frame + 1][0] - points[frame][0];
+        const ty = points[frame + 1][1] - points[frame][1];
         symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2;
 
         this._lastFrame = frame;
diff --git a/src/chart/helper/EffectSymbol.ts b/src/chart/helper/EffectSymbol.ts
index 3edab7c..4abf1de 100644
--- a/src/chart/helper/EffectSymbol.ts
+++ b/src/chart/helper/EffectSymbol.ts
@@ -50,7 +50,7 @@ function normalizeSymbolSize(symbolSize: number | number[]): number[] {
 }
 
 function updateRipplePath(rippleGroup: Group, effectCfg: RippleEffectCfg) {
-    let color = effectCfg.rippleEffectColor || effectCfg.color;
+    const color = effectCfg.rippleEffectColor || effectCfg.color;
     rippleGroup.eachChild(function (ripplePath: Displayable) {
         ripplePath.attr({
             z: effectCfg.z,
@@ -70,8 +70,8 @@ class EffectSymbol extends Group {
     constructor(data: List, idx: number) {
         super();
 
-        let symbol = new SymbolClz(data, idx);
-        let rippleGroup = new Group();
+        const symbol = new SymbolClz(data, idx);
+        const rippleGroup = new Group();
         this.add(symbol);
         this.add(rippleGroup);
 
@@ -84,15 +84,15 @@ class EffectSymbol extends Group {
     }
 
     startEffectAnimation(effectCfg: RippleEffectCfg) {
-        let symbolType = effectCfg.symbolType;
-        let color = effectCfg.color;
-        let rippleGroup = this.childAt(1) as Group;
+        const symbolType = effectCfg.symbolType;
+        const color = effectCfg.color;
+        const rippleGroup = this.childAt(1) as Group;
 
         for (let i = 0; i < EFFECT_RIPPLE_NUMBER; i++) {
             // If width/height are set too small (e.g., set to 1) on ios10
             // and macOS Sierra, a circle stroke become a rect, no matter what
             // the scale is set. So we set width/height as 2. See #4136.
-            let ripplePath = createSymbol(
+            const ripplePath = createSymbol(
                 symbolType, -1, -1, 2, 2, color
             );
             ripplePath.attr({
@@ -104,7 +104,7 @@ class EffectSymbol extends Group {
                 scale: [0.5, 0.5]
             });
 
-            let delay = -i / EFFECT_RIPPLE_NUMBER * effectCfg.period + effectCfg.effectOffset;
+            const delay = -i / EFFECT_RIPPLE_NUMBER * effectCfg.period + effectCfg.effectOffset;
             // TODO Configurable effectCfg.period
             ripplePath.animate('', true)
                 .when(effectCfg.period, {
@@ -129,13 +129,13 @@ class EffectSymbol extends Group {
      * Update effect symbol
      */
     updateEffectAnimation(effectCfg: RippleEffectCfg) {
-        let oldEffectCfg = this._effectCfg;
-        let rippleGroup = this.childAt(1) as Group;
+        const oldEffectCfg = this._effectCfg;
+        const rippleGroup = this.childAt(1) as Group;
 
         // Must reinitialize effect if following configuration changed
-        let DIFFICULT_PROPS = ['symbolType', 'period', 'rippleScale'] as const;
+        const DIFFICULT_PROPS = ['symbolType', 'period', 'rippleScale'] as const;
         for (let i = 0; i < DIFFICULT_PROPS.length; i++) {
-            let propName = DIFFICULT_PROPS[i];
+            const propName = DIFFICULT_PROPS[i];
             if (oldEffectCfg[propName] !== effectCfg[propName]) {
                 this.stopEffectAnimation();
                 this.startEffectAnimation(effectCfg);
@@ -164,15 +164,15 @@ class EffectSymbol extends Group {
      * Update symbol properties
      */
     updateData(data: List, idx: number) {
-        let seriesModel = data.hostModel;
+        const seriesModel = data.hostModel;
 
         (this.childAt(0) as SymbolClz).updateData(data, idx);
 
-        let rippleGroup = this.childAt(1);
-        let itemModel = data.getItemModel<SymbolDrawItemModelOption>(idx);
-        let symbolType = data.getItemVisual(idx, 'symbol');
-        let symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize'));
-        let color = data.getItemVisual(idx, 'color');
+        const rippleGroup = this.childAt(1);
+        const itemModel = data.getItemModel<SymbolDrawItemModelOption>(idx);
+        const symbolType = data.getItemVisual(idx, 'symbol');
+        const symbolSize = normalizeSymbolSize(data.getItemVisual(idx, 'symbolSize'));
+        const color = data.getItemVisual(idx, 'color');
 
         rippleGroup.attr('scale', symbolSize);
 
@@ -180,15 +180,15 @@ class EffectSymbol extends Group {
             ripplePath.setStyle('fill', color);
         });
 
-        let symbolOffset = itemModel.getShallow('symbolOffset');
+        const symbolOffset = itemModel.getShallow('symbolOffset');
         if (symbolOffset) {
-            let pos = rippleGroup.position;
+            const pos = rippleGroup.position;
             pos[0] = parsePercent(symbolOffset[0], symbolSize[0]);
             pos[1] = parsePercent(symbolOffset[1], symbolSize[1]);
         }
         rippleGroup.rotation = (itemModel.getShallow('symbolRotate') || 0) * Math.PI / 180 || 0;
 
-        let effectCfg: RippleEffectCfg = {};
+        const effectCfg: RippleEffectCfg = {};
 
         effectCfg.showEffectOn = seriesModel.get('showEffectOn');
         effectCfg.rippleScale = itemModel.get(['rippleEffect', 'scale']);
@@ -215,14 +215,14 @@ class EffectSymbol extends Group {
             this._effectCfg = null;
 
             this.stopEffectAnimation();
-            let symbol = this.childAt(0) as SymbolClz;
-            let onEmphasis = function (this: EffectSymbol) {
+            const symbol = this.childAt(0) as SymbolClz;
+            const onEmphasis = function (this: EffectSymbol) {
                 symbol.highlight();
                 if (effectCfg.showEffectOn !== 'render') {
                     this.startEffectAnimation(effectCfg);
                 }
             };
-            let onNormal = function (this: EffectSymbol) {
+            const onNormal = function (this: EffectSymbol) {
                 symbol.downplay();
                 if (effectCfg.showEffectOn !== 'render') {
                     this.stopEffectAnimation();
diff --git a/src/chart/helper/LargeLineDraw.ts b/src/chart/helper/LargeLineDraw.ts
index 8d5d061..761a21f 100644
--- a/src/chart/helper/LargeLineDraw.ts
+++ b/src/chart/helper/LargeLineDraw.ts
@@ -73,12 +73,12 @@ class LargeLinesPath extends graphic.Path {
     }
 
     buildPath(ctx: CanvasRenderingContext2D, shape: LargeLinesPathShape) {
-        let segs = shape.segs;
-        let curveness = shape.curveness;
+        const segs = shape.segs;
+        const curveness = shape.curveness;
 
         if (shape.polyline) {
             for (let i = 0; i < segs.length;) {
-                let count = segs[i++];
+                const count = segs[i++];
                 if (count > 0) {
                     ctx.moveTo(segs[i++], segs[i++]);
                     for (let k = 1; k < count; k++) {
@@ -89,14 +89,14 @@ class LargeLinesPath extends graphic.Path {
         }
         else {
             for (let i = 0; i < segs.length;) {
-                let x0 = segs[i++];
-                let y0 = segs[i++];
-                let x1 = segs[i++];
-                let y1 = segs[i++];
+                const x0 = segs[i++];
+                const y0 = segs[i++];
+                const x1 = segs[i++];
+                const y1 = segs[i++];
                 ctx.moveTo(x0, y0);
                 if (curveness > 0) {
-                    let x2 = (x0 + x1) / 2 - (y0 - y1) * curveness;
-                    let y2 = (y0 + y1) / 2 - (x1 - x0) * curveness;
+                    const x2 = (x0 + x1) / 2 - (y0 - y1) * curveness;
+                    const y2 = (y0 + y1) / 2 - (x1 - x0) * curveness;
                     ctx.quadraticCurveTo(x2, y2, x1, y1);
                 }
                 else {
@@ -108,21 +108,21 @@ class LargeLinesPath extends graphic.Path {
 
     findDataIndex(x: number, y: number) {
 
-        let shape = this.shape;
-        let segs = shape.segs;
-        let curveness = shape.curveness;
-        let lineWidth = this.style.lineWidth;
+        const shape = this.shape;
+        const segs = shape.segs;
+        const curveness = shape.curveness;
+        const lineWidth = this.style.lineWidth;
 
         if (shape.polyline) {
             let dataIndex = 0;
             for (let i = 0; i < segs.length;) {
-                let count = segs[i++];
+                const count = segs[i++];
                 if (count > 0) {
-                    let x0 = segs[i++];
-                    let y0 = segs[i++];
+                    const x0 = segs[i++];
+                    const y0 = segs[i++];
                     for (let k = 1; k < count; k++) {
-                        let x1 = segs[i++];
-                        let y1 = segs[i++];
+                        const x1 = segs[i++];
+                        const y1 = segs[i++];
                         if (lineContain.containStroke(x0, y0, x1, y1, lineWidth, x, y)) {
                             return dataIndex;
                         }
@@ -135,13 +135,13 @@ class LargeLinesPath extends graphic.Path {
         else {
             let dataIndex = 0;
             for (let i = 0; i < segs.length;) {
-                let x0 = segs[i++];
-                let y0 = segs[i++];
-                let x1 = segs[i++];
-                let y1 = segs[i++];
+                const x0 = segs[i++];
+                const y0 = segs[i++];
+                const x1 = segs[i++];
+                const y1 = segs[i++];
                 if (curveness > 0) {
-                    let x2 = (x0 + x1) / 2 - (y0 - y1) * curveness;
-                    let y2 = (y0 + y1) / 2 - (x1 - x0) * curveness;
+                    const x2 = (x0 + x1) / 2 - (y0 - y1) * curveness;
+                    const y2 = (y0 + y1) / 2 - (x1 - x0) * curveness;
 
                     if (quadraticContain.containStroke(
                         x0, y0, x2, y2, x1, y1, lineWidth, x, y
@@ -180,7 +180,7 @@ class LargeLineDraw {
     updateData(data: LargeLinesData) {
         this.group.removeAll();
 
-        let lineEl = new LargeLinesPath({
+        const lineEl = new LargeLinesPath({
             rectHover: true,
             cursor: 'default'
         });
@@ -221,7 +221,7 @@ class LargeLineDraw {
      * @override
      */
     incrementalUpdate(taskParams: StageHandlerProgressParams, data: LargeLinesData) {
-        let lineEl = new LargeLinesPath();
+        const lineEl = new LargeLinesPath();
         lineEl.setShape({
             segs: data.getLayout('linesPoints')
         });
@@ -249,7 +249,7 @@ class LargeLineDraw {
     };
 
     _setCommon(lineEl: LargeLinesPath, data: LargeLinesData, isIncremental?: boolean) {
-        let hostModel = data.hostModel;
+        const hostModel = data.hostModel;
 
         lineEl.setShape({
             polyline: hostModel.get('polyline'),
@@ -261,20 +261,20 @@ class LargeLineDraw {
         );
         lineEl.style.strokeNoScale = true;
 
-        let visualColor = data.getVisual('color');
+        const visualColor = data.getVisual('color');
         if (visualColor) {
             lineEl.setStyle('stroke', visualColor);
         }
         lineEl.setStyle('fill', null);
 
         if (!isIncremental) {
-            let ecData = graphic.getECData(lineEl);
+            const ecData = graphic.getECData(lineEl);
             // Enable tooltip
             // PENDING May have performance issue when path is extremely large
             ecData.seriesIndex = hostModel.seriesIndex;
             lineEl.on('mousemove', function (e) {
                 ecData.dataIndex = null;
-                let dataIndex = lineEl.findDataIndex(e.offsetX, e.offsetY);
+                const dataIndex = lineEl.findDataIndex(e.offsetX, e.offsetY);
                 if (dataIndex > 0) {
                     // Provide dataIndex for tooltip
                     ecData.dataIndex = dataIndex + lineEl.__startIndex;
@@ -284,7 +284,7 @@ class LargeLineDraw {
     };
 
     _clearIncremental() {
-        let incremental = this._incremental;
+        const incremental = this._incremental;
         if (incremental) {
             incremental.clearDisplaybles();
         }
diff --git a/src/chart/helper/LargeSymbolDraw.ts b/src/chart/helper/LargeSymbolDraw.ts
index dea6dde..ef30a1f 100644
--- a/src/chart/helper/LargeSymbolDraw.ts
+++ b/src/chart/helper/LargeSymbolDraw.ts
@@ -70,15 +70,15 @@ class LargeSymbolPath extends graphic.Path<LargeSymbolPathProps> {
     setColor: ECSymbol['setColor'];
 
     buildPath(path: PathProxy | CanvasRenderingContext2D, shape: LargeSymbolPathShape) {
-        let points = shape.points;
-        let size = shape.size;
+        const points = shape.points;
+        const size = shape.size;
 
-        let symbolProxy = this.symbolProxy;
-        let symbolProxyShape = symbolProxy.shape;
-        let ctx = (path as PathProxy).getContext
+        const symbolProxy = this.symbolProxy;
+        const symbolProxyShape = symbolProxy.shape;
+        const ctx = (path as PathProxy).getContext
             ? (path as PathProxy).getContext()
             : path as CanvasRenderingContext2D;
-        let canBoost = ctx && size[0] < BOOST_SIZE_THRESHOLD;
+        const canBoost = ctx && size[0] < BOOST_SIZE_THRESHOLD;
 
         // Do draw in afterBrush.
         if (canBoost) {
@@ -89,8 +89,8 @@ class LargeSymbolPath extends graphic.Path<LargeSymbolPathProps> {
         this._ctx = null;
 
         for (let i = 0; i < points.length;) {
-            let x = points[i++];
-            let y = points[i++];
+            const x = points[i++];
+            const y = points[i++];
 
             if (isNaN(x) || isNaN(y)) {
                 continue;
@@ -109,10 +109,10 @@ class LargeSymbolPath extends graphic.Path<LargeSymbolPathProps> {
     }
 
     afterBrush() {
-        let shape = this.shape;
-        let points = shape.points;
-        let size = shape.size;
-        let ctx = this._ctx;
+        const shape = this.shape;
+        const points = shape.points;
+        const size = shape.size;
+        const ctx = this._ctx;
 
         if (!ctx) {
             return;
@@ -120,8 +120,8 @@ class LargeSymbolPath extends graphic.Path<LargeSymbolPathProps> {
 
         // PENDING If style or other canvas status changed?
         for (let i = 0; i < points.length;) {
-            let x = points[i++];
-            let y = points[i++];
+            const x = points[i++];
+            const y = points[i++];
             if (isNaN(x) || isNaN(y)) {
                 continue;
             }
@@ -141,20 +141,20 @@ class LargeSymbolPath extends graphic.Path<LargeSymbolPathProps> {
         // TODO ???
         // Consider transform
 
-        let shape = this.shape;
-        let points = shape.points;
-        let size = shape.size;
+        const shape = this.shape;
+        const points = shape.points;
+        const size = shape.size;
 
-        let w = Math.max(size[0], 4);
-        let h = Math.max(size[1], 4);
+        const w = Math.max(size[0], 4);
+        const h = Math.max(size[1], 4);
 
         // Not consider transform
         // Treat each element as a rect
         // top down traverse
         for (let idx = points.length / 2 - 1; idx >= 0; idx--) {
-            let i = idx * 2;
-            let x0 = points[i] - w / 2;
-            let y0 = points[i + 1] - h / 2;
+            const i = idx * 2;
+            const x0 = points[i] - w / 2;
+            const y0 = points[i + 1] - h / 2;
             if (x >= x0 && y >= y0 && x <= x0 + w && y <= y0 + h) {
                 return idx;
             }
@@ -183,7 +183,7 @@ class LargeSymbolDraw {
      */
     updateData(data: List, opt?: UpdateOpt) {
         this.group.removeAll();
-        let symbolEl = new LargeSymbolPath({
+        const symbolEl = new LargeSymbolPath({
             rectHover: true,
             cursor: 'default'
         });
@@ -205,8 +205,8 @@ class LargeSymbolDraw {
         let points = data.getLayout('symbolPoints');
         this.group.eachChild(function (child: LargeSymbolPath) {
             if (child.startIndex != null) {
-                let len = (child.endIndex - child.startIndex) * 2;
-                let byteOffset = child.startIndex * 4 * 2;
+                const len = (child.endIndex - child.startIndex) * 2;
+                const byteOffset = child.startIndex * 4 * 2;
                 points = new Float32Array(points.buffer, byteOffset, len);
             }
             child.setShape('points', points);
@@ -261,7 +261,7 @@ class LargeSymbolDraw {
         isIncremental: boolean,
         opt: UpdateOpt
     ) {
-        let hostModel = data.hostModel;
+        const hostModel = data.hostModel;
 
         opt = opt || {};
         // TODO
@@ -275,7 +275,7 @@ class LargeSymbolDraw {
         //     ));
         // }
         // else {
-        let size = data.getVisual('symbolSize');
+        const size = data.getVisual('symbolSize');
         symbolEl.setShape('size', (size instanceof Array) ? size : [size, size]);
         // }
 
@@ -287,7 +287,7 @@ class LargeSymbolDraw {
         // Use symbolProxy setColor method
         symbolEl.setColor = symbolEl.symbolProxy.setColor;
 
-        let extrudeShadow = symbolEl.shape.size[0] < BOOST_SIZE_THRESHOLD;
+        const extrudeShadow = symbolEl.shape.size[0] < BOOST_SIZE_THRESHOLD;
         symbolEl.useStyle(
             // Draw shadow when doing fillRect is extremely slow.
             hostModel.getModel('itemStyle').getItemStyle(
@@ -295,19 +295,19 @@ class LargeSymbolDraw {
             )
         );
 
-        let visualColor = data.getVisual('color');
+        const visualColor = data.getVisual('color');
         if (visualColor) {
             symbolEl.setColor(visualColor);
         }
 
         if (!isIncremental) {
-            let ecData = graphic.getECData(symbolEl);
+            const ecData = graphic.getECData(symbolEl);
             // Enable tooltip
             // PENDING May have performance issue when path is extremely large
             ecData.seriesIndex = (hostModel as SeriesModel).seriesIndex;
             symbolEl.on('mousemove', function (e) {
                 ecData.dataIndex = null;
-                let dataIndex = symbolEl.findDataIndex(e.offsetX, e.offsetY);
+                const dataIndex = symbolEl.findDataIndex(e.offsetX, e.offsetY);
                 if (dataIndex >= 0) {
                     // Provide dataIndex for tooltip
                     ecData.dataIndex = dataIndex + (symbolEl.startIndex || 0);
@@ -323,7 +323,7 @@ class LargeSymbolDraw {
     }
 
     _clearIncremental() {
-        let incremental = this._incremental;
+        const incremental = this._incremental;
         if (incremental) {
             incremental.clearDisplaybles();
         }
diff --git a/src/chart/helper/Line.ts b/src/chart/helper/Line.ts
index 8d13c3d..c1c7ee6 100644
--- a/src/chart/helper/Line.ts
+++ b/src/chart/helper/Line.ts
@@ -52,8 +52,8 @@ function makeSymbolTypeKey(symbolCategory: string) {
  * @inner
  */
 function createSymbol(name: string, lineData: List, idx: number) {
-    let color = lineData.getItemVisual(idx, 'color');
-    let symbolType = lineData.getItemVisual(idx, name);
+    const color = lineData.getItemVisual(idx, 'color');
+    const symbolType = lineData.getItemVisual(idx, name);
     let symbolSize = lineData.getItemVisual(idx, name + 'Size');
 
     if (!symbolType || symbolType === 'none') {
@@ -63,7 +63,7 @@ function createSymbol(name: string, lineData: List, idx: number) {
     if (!zrUtil.isArray(symbolSize)) {
         symbolSize = [symbolSize, symbolSize];
     }
-    let symbolPath = symbolUtil.createSymbol(
+    const symbolPath = symbolUtil.createSymbol(
         symbolType, -symbolSize[0] / 2, -symbolSize[1] / 2,
         symbolSize[0], symbolSize[1], color
     );
@@ -74,7 +74,7 @@ function createSymbol(name: string, lineData: List, idx: number) {
 }
 
 function createLine(points: number[][]) {
-    let line = new ECLinePath({
+    const line = new ECLinePath({
         name: 'line',
         subPixelOptimize: true
     });
@@ -94,7 +94,7 @@ function setLinePoints(targetShape: ECLinePath['shape'], points: number[][]) {
     targetShape.y2 = points[1][1];
     targetShape.percent = 1;
 
-    let cp1 = points[2];
+    const cp1 = points[2];
     if (cp1) {
         (targetShape as CurveShape).cpx1 = cp1[0];
         (targetShape as CurveShape).cpy1 = cp1[1];
@@ -117,9 +117,9 @@ class Line extends graphic.Group {
     }
 
     _createLine(lineData: List, idx: number, seriesScope?: LineDrawSeriesScope) {
-        let seriesModel = lineData.hostModel;
-        let linePoints = lineData.getItemLayout(idx);
-        let line = createLine(linePoints);
+        const seriesModel = lineData.hostModel;
+        const linePoints = lineData.getItemLayout(idx);
+        const line = createLine(linePoints);
         line.shape.percent = 0;
         graphic.initProps(line, {
             shape: {
@@ -129,7 +129,7 @@ class Line extends graphic.Group {
 
         this.add(line);
 
-        let label = new graphic.Text({
+        const label = new graphic.Text({
             name: 'label'
         }) as InnerLineLabel;
         // FIXME
@@ -139,7 +139,7 @@ class Line extends graphic.Group {
         this.add(label);
 
         zrUtil.each(SYMBOL_CATEGORIES, function (symbolCategory) {
-            let symbol = createSymbol(symbolCategory, lineData, idx);
+            const symbol = createSymbol(symbolCategory, lineData, idx);
             // symbols must added after line to make sure
             // it will be updated after line#update.
             // Or symbol position and rotation update in line#beforeUpdate will be one frame slow
@@ -151,11 +151,11 @@ class Line extends graphic.Group {
     }
 
     updateData(lineData: List, idx: number, seriesScope: LineDrawSeriesScope) {
-        let seriesModel = lineData.hostModel;
+        const seriesModel = lineData.hostModel;
 
-        let line = this.childOfName('line') as ECLinePath;
-        let linePoints = lineData.getItemLayout(idx);
-        let target = {
+        const line = this.childOfName('line') as ECLinePath;
+        const linePoints = lineData.getItemLayout(idx);
+        const target = {
             shape: {} as ECLinePath['shape']
         };
 
@@ -163,12 +163,12 @@ class Line extends graphic.Group {
         graphic.updateProps(line, target, seriesModel, idx);
 
         zrUtil.each(SYMBOL_CATEGORIES, function (symbolCategory) {
-            let symbolType = lineData.getItemVisual(idx, symbolCategory);
-            let key = makeSymbolTypeKey(symbolCategory);
+            const symbolType = lineData.getItemVisual(idx, symbolCategory);
+            const key = makeSymbolTypeKey(symbolCategory);
             // Symbol changed
             if (this[key] !== symbolType) {
                 this.remove(this.childOfName(symbolCategory));
-                let symbol = createSymbol(symbolCategory, lineData, idx);
+                const symbol = createSymbol(symbolCategory, lineData, idx);
                 this.add(symbol);
             }
             this[key] = symbolType;
@@ -178,9 +178,9 @@ class Line extends graphic.Group {
     };
 
     _updateCommonStl(lineData: List, idx: number, seriesScope?: LineDrawSeriesScope) {
-        let seriesModel = lineData.hostModel as SeriesModel;
+        const seriesModel = lineData.hostModel as SeriesModel;
 
-        let line = this.childOfName('line') as ECLinePath;
+        const line = this.childOfName('line') as ECLinePath;
 
         let lineStyle = seriesScope && seriesScope.lineStyle;
         let hoverLineStyle = seriesScope && seriesScope.hoverLineStyle;
@@ -189,7 +189,7 @@ class Line extends graphic.Group {
 
         // Optimization for large dataset
         if (!seriesScope || lineData.hasItemOption) {
-            let itemModel = lineData.getItemModel<LineDrawModelOption>(idx);
+            const itemModel = lineData.getItemModel<LineDrawModelOption>(idx);
 
             lineStyle = itemModel.getModel('lineStyle').getLineStyle();
             hoverLineStyle = itemModel.getModel(['emphasis', 'lineStyle']).getLineStyle();
@@ -198,8 +198,8 @@ class Line extends graphic.Group {
             hoverLabelModel = itemModel.getModel(['emphasis', 'label']);
         }
 
-        let visualColor = lineData.getItemVisual(idx, 'color');
-        let visualOpacity = zrUtil.retrieve3(
+        const visualColor = lineData.getItemVisual(idx, 'color');
+        const visualOpacity = zrUtil.retrieve3(
             lineData.getItemVisual(idx, 'opacity'),
             lineStyle.opacity,
             1
@@ -219,7 +219,7 @@ class Line extends graphic.Group {
 
         // Update symbol
         zrUtil.each(SYMBOL_CATEGORIES, function (symbolCategory) {
-            let symbol = this.childOfName(symbolCategory) as ECSymbol;
+            const symbol = this.childOfName(symbolCategory) as ECSymbol;
             if (symbol) {
                 symbol.setColor(visualColor);
                 symbol.setStyle({
@@ -228,10 +228,10 @@ class Line extends graphic.Group {
             }
         }, this);
 
-        let showLabel = labelModel.getShallow('show');
-        let hoverShowLabel = hoverLabelModel.getShallow('show');
+        const showLabel = labelModel.getShallow('show');
+        const hoverShowLabel = hoverLabelModel.getShallow('show');
 
-        let label = this.childOfName('label') as InnerLineLabel;
+        const label = this.childOfName('label') as InnerLineLabel;
         let defaultLabelColor;
         let baseText;
 
@@ -241,7 +241,7 @@ class Line extends graphic.Group {
 
             baseText = seriesModel.getFormattedLabel(idx, 'normal', lineData.dataType);
             if (baseText == null) {
-                let rawVal = seriesModel.getRawValue(idx) as number;
+                const rawVal = seriesModel.getRawValue(idx) as number;
                 baseText = rawVal == null
                     ? lineData.getName(idx)
                     : isFinite(rawVal)
@@ -249,8 +249,8 @@ class Line extends graphic.Group {
                     : rawVal;
             }
         }
-        let normalText = showLabel ? baseText : null;
-        let emphasisText = hoverShowLabel
+        const normalText = showLabel ? baseText : null;
+        const emphasisText = hoverShowLabel
             ? zrUtil.retrieve2(
                 seriesModel.getFormattedLabel(idx, 'emphasis', lineData.dataType),
                 baseText
@@ -315,16 +315,16 @@ class Line extends graphic.Group {
     }
 
     setLinePoints(points: number[][]) {
-        let linePath = this.childOfName('line') as ECLinePath;
+        const linePath = this.childOfName('line') as ECLinePath;
         setLinePoints(linePath.shape, points);
         linePath.dirty();
     }
 
     beforeUpdate() {
-        let lineGroup = this;
-        let symbolFrom = lineGroup.childOfName('fromSymbol') as ECSymbol;
-        let symbolTo = lineGroup.childOfName('toSymbol') as ECSymbol;
-        let label = lineGroup.childOfName('label') as InnerLineLabel;
+        const lineGroup = this;
+        const symbolFrom = lineGroup.childOfName('fromSymbol') as ECSymbol;
+        const symbolTo = lineGroup.childOfName('toSymbol') as ECSymbol;
+        const label = lineGroup.childOfName('label') as InnerLineLabel;
         // Quick reject
         if (!symbolFrom && !symbolTo && label.ignore) {
             return;
@@ -339,23 +339,23 @@ class Line extends graphic.Group {
             parentNode = parentNode.parent;
         }
 
-        let line = lineGroup.childOfName('line') as ECLinePath;
+        const line = lineGroup.childOfName('line') as ECLinePath;
         // If line not changed
         // FIXME Parent scale changed
         if (!this.__dirty && !line.__dirty) {
             return;
         }
 
-        let percent = line.shape.percent;
-        let fromPos = line.pointAt(0);
-        let toPos = line.pointAt(percent);
+        const percent = line.shape.percent;
+        const fromPos = line.pointAt(0);
+        const toPos = line.pointAt(percent);
 
-        let d = vector.sub([], toPos, fromPos);
+        const d = vector.sub([], toPos, fromPos);
         vector.normalize(d, d);
 
         if (symbolFrom) {
             symbolFrom.attr('position', fromPos);
-            let tangent = line.tangentAt(0);
+            const tangent = line.tangentAt(0);
             symbolFrom.attr('rotation', Math.PI / 2 - Math.atan2(
                 tangent[1], tangent[0]
             ));
@@ -363,7 +363,7 @@ class Line extends graphic.Group {
         }
         if (symbolTo) {
             symbolTo.attr('position', toPos);
-            let tangent = line.tangentAt(1);
+            const tangent = line.tangentAt(1);
             symbolTo.attr('rotation', -Math.PI / 2 - Math.atan2(
                 tangent[1], tangent[0]
             ));
@@ -378,18 +378,18 @@ class Line extends graphic.Group {
             let textVerticalAlign: ZRTextVerticalAlign;
             let textOrigin;
 
-            let distance = label.__labelDistance;
-            let distanceX = distance[0] * invScale;
-            let distanceY = distance[1] * invScale;
-            let halfPercent = percent / 2;
-            let tangent = line.tangentAt(halfPercent);
-            let n = [tangent[1], -tangent[0]];
-            let cp = line.pointAt(halfPercent);
+            const distance = label.__labelDistance;
+            const distanceX = distance[0] * invScale;
+            const distanceY = distance[1] * invScale;
+            const halfPercent = percent / 2;
+            const tangent = line.tangentAt(halfPercent);
+            const n = [tangent[1], -tangent[0]];
+            const cp = line.pointAt(halfPercent);
             if (n[1] > 0) {
                 n[0] = -n[0];
                 n[1] = -n[1];
             }
-            let dir = tangent[0] < 0 ? -1 : 1;
+            const dir = tangent[0] < 0 ? -1 : 1;
 
             if (label.__position !== 'start' && label.__position !== 'end') {
                 let rotation = -Math.atan2(tangent[1], tangent[0]);
diff --git a/src/chart/helper/LineDraw.ts b/src/chart/helper/LineDraw.ts
index 9881435..18e6857 100644
--- a/src/chart/helper/LineDraw.ts
+++ b/src/chart/helper/LineDraw.ts
@@ -102,10 +102,10 @@ class LineDraw {
     };
 
     updateData(lineData: ListForLineDraw) {
-        let lineDraw = this;
-        let group = lineDraw.group;
+        const lineDraw = this;
+        const group = lineDraw.group;
 
-        let oldLineData = lineDraw._lineData;
+        const oldLineData = lineDraw._lineData;
         lineDraw._lineData = lineData;
 
         // There is no oldLineData only when first rendering or switching from
@@ -114,7 +114,7 @@ class LineDraw {
             group.removeAll();
         }
 
-        let seriesScope = makeSeriesScope(lineData);
+        const seriesScope = makeSeriesScope(lineData);
 
         lineData.diff(oldLineData)
             .add((idx) => {
@@ -130,7 +130,7 @@ class LineDraw {
     };
 
     updateLayout() {
-        let lineData = this._lineData;
+        const lineData = this._lineData;
 
         // Do not support update layout in incremental mode.
         if (!lineData) {
@@ -156,10 +156,10 @@ class LineDraw {
         }
 
         for (let idx = taskParams.start; idx < taskParams.end; idx++) {
-            let itemLayout = lineData.getItemLayout(idx);
+            const itemLayout = lineData.getItemLayout(idx);
 
             if (lineNeedsDraw(itemLayout)) {
-                let el = new this._LineCtor(lineData, idx, this._seriesScope);
+                const el = new this._LineCtor(lineData, idx, this._seriesScope);
                 el.traverse(updateIncrementalAndHover);
 
                 this.group.add(el);
@@ -177,13 +177,13 @@ class LineDraw {
         idx: number,
         seriesScope: LineDrawSeriesScope
     ) {
-        let itemLayout = lineData.getItemLayout(idx);
+        const itemLayout = lineData.getItemLayout(idx);
 
         if (!lineNeedsDraw(itemLayout)) {
             return;
         }
 
-        let el = new this._LineCtor(lineData, idx, seriesScope);
+        const el = new this._LineCtor(lineData, idx, seriesScope);
         lineData.setItemGraphicEl(idx, el);
         this.group.add(el);
     }
@@ -215,7 +215,7 @@ class LineDraw {
 }
 
 function makeSeriesScope(lineData: ListForLineDraw) {
-    let hostModel = lineData.hostModel;
+    const hostModel = lineData.hostModel;
     return {
         lineStyle: hostModel.getModel('lineStyle').getLineStyle(),
         hoverLineStyle: hostModel.getModel(['emphasis', 'lineStyle']).getLineStyle(),
diff --git a/src/chart/helper/LinePath.ts b/src/chart/helper/LinePath.ts
index f81e61a..af7b2ca 100644
--- a/src/chart/helper/LinePath.ts
+++ b/src/chart/helper/LinePath.ts
@@ -92,8 +92,8 @@ class ECLinePath extends graphic.Path<ECLineProps> {
     }
 
     tangentAt(t: number) {
-        let shape = this.shape;
-        let p = isStraightLine(shape)
+        const shape = this.shape;
+        const p = isStraightLine(shape)
             ? [shape.x2 - shape.x1, shape.y2 - shape.y1]
             : bezierCurveProto.tangentAt.call(this, t);
         return vec2.normalize(p, p);
diff --git a/src/chart/helper/Polyline.ts b/src/chart/helper/Polyline.ts
index 01ae543..49df307 100644
--- a/src/chart/helper/Polyline.ts
+++ b/src/chart/helper/Polyline.ts
@@ -30,9 +30,9 @@ class Polyline extends graphic.Group {
 
     private _createPolyline(lineData: List, idx: number, seriesScope: LineDrawSeriesScope) {
         // let seriesModel = lineData.hostModel;
-        let points = lineData.getItemLayout(idx);
+        const points = lineData.getItemLayout(idx);
 
-        let line = new graphic.Polyline({
+        const line = new graphic.Polyline({
             shape: {
                 points: points
             }
@@ -44,10 +44,10 @@ class Polyline extends graphic.Group {
     };
 
     updateData(lineData: List, idx: number, seriesScope: LineDrawSeriesScope) {
-        let seriesModel = lineData.hostModel;
+        const seriesModel = lineData.hostModel;
 
-        let line = this.childAt(0) as graphic.Polyline;
-        let target = {
+        const line = this.childAt(0) as graphic.Polyline;
+        const target = {
             shape: {
                 points: lineData.getItemLayout(idx) as number[][]
             }
@@ -58,10 +58,10 @@ class Polyline extends graphic.Group {
     };
 
     _updateCommonStl(lineData: List, idx: number, seriesScope: LineDrawSeriesScope) {
-        let line = this.childAt(0) as graphic.Polyline;
-        let itemModel = lineData.getItemModel<LineDrawModelOption>(idx);
+        const line = this.childAt(0) as graphic.Polyline;
+        const itemModel = lineData.getItemModel<LineDrawModelOption>(idx);
 
-        let visualColor = lineData.getItemVisual(idx, 'color');
+        const visualColor = lineData.getItemVisual(idx, 'color');
 
         let lineStyle = seriesScope && seriesScope.lineStyle;
         let hoverLineStyle = seriesScope && seriesScope.hoverLineStyle;
@@ -86,7 +86,7 @@ class Polyline extends graphic.Group {
     };
 
     updateLayout(lineData: List, idx: number) {
-        let polyline = this.childAt(0) as graphic.Polyline;
+        const polyline = this.childAt(0) as graphic.Polyline;
         polyline.setShape('points', lineData.getItemLayout(idx));
     };
 
diff --git a/src/chart/helper/Symbol.ts b/src/chart/helper/Symbol.ts
index f219ca2..56be9d8 100644
--- a/src/chart/helper/Symbol.ts
+++ b/src/chart/helper/Symbol.ts
@@ -61,7 +61,7 @@ class Symbol extends graphic.Group {
         // Remove paths created before
         this.removeAll();
 
-        let color = data.getItemVisual(idx, 'color');
+        const color = data.getItemVisual(idx, 'color');
 
         // let symbolPath = createSymbol(
         //     symbolType, -0.5, -0.5, 1, 1, color
@@ -69,7 +69,7 @@ class Symbol extends graphic.Group {
         // If width/height are set too small (e.g., set to 1) on ios10
         // and macOS Sierra, a circle stroke become a rect, no matter what
         // the scale is set. So we set width/height as 2. See #4150.
-        let symbolPath = createSymbol(
+        const symbolPath = createSymbol(
             symbolType, -1, -1, 2, 2, color, keepAspect
         );
 
@@ -134,13 +134,13 @@ class Symbol extends graphic.Group {
      * @param {number} z
      */
     setZ(zlevel: number, z: number) {
-        let symbolPath = this.childAt(0) as ECSymbol;
+        const symbolPath = this.childAt(0) as ECSymbol;
         symbolPath.zlevel = zlevel;
         symbolPath.z = z;
     }
 
     setDraggable(draggable: boolean) {
-        let symbolPath = this.childAt(0) as ECSymbol;
+        const symbolPath = this.childAt(0) as ECSymbol;
         symbolPath.draggable = draggable;
         symbolPath.cursor = draggable ? 'move' : symbolPath.cursor;
     }
@@ -151,13 +151,13 @@ class Symbol extends graphic.Group {
     updateData(data: List, idx: number, seriesScope?: SymbolDrawSeriesScope) {
         this.silent = false;
 
-        let symbolType = data.getItemVisual(idx, 'symbol') || 'circle';
-        let seriesModel = data.hostModel as SeriesModel;
-        let symbolSize = Symbol.getSymbolSize(data, idx);
-        let isInit = symbolType !== this._symbolType;
+        const symbolType = data.getItemVisual(idx, 'symbol') || 'circle';
+        const seriesModel = data.hostModel as SeriesModel;
+        const symbolSize = Symbol.getSymbolSize(data, idx);
+        const isInit = symbolType !== this._symbolType;
 
         if (isInit) {
-            let keepAspect = data.getItemVisual(idx, 'symbolKeepAspect');
+            const keepAspect = data.getItemVisual(idx, 'symbolKeepAspect');
             this._createSymbol(symbolType, data, idx, symbolSize, keepAspect);
         }
         else {
@@ -172,9 +172,9 @@ class Symbol extends graphic.Group {
 
         if (isInit) {
             const symbolPath = this.childAt(0) as ECSymbol;
-            let fadeIn = seriesScope && seriesScope.fadeIn;
+            const fadeIn = seriesScope && seriesScope.fadeIn;
 
-            let target: PathProps = {
+            const target: PathProps = {
                 scale: symbolPath.scale.slice()
             };
             fadeIn && (target.style = {
@@ -196,9 +196,9 @@ class Symbol extends graphic.Group {
         symbolSize: number[],
         seriesScope?: SymbolDrawSeriesScope
     ) {
-        let symbolPath = this.childAt(0) as ECSymbol;
-        let seriesModel = data.hostModel as SeriesModel;
-        let color = data.getItemVisual(idx, 'color');
+        const symbolPath = this.childAt(0) as ECSymbol;
+        const seriesModel = data.hostModel as SeriesModel;
+        const color = data.getItemVisual(idx, 'color');
 
         // Reset style
         if (symbolPath.type !== 'image') {
@@ -226,7 +226,7 @@ class Symbol extends graphic.Group {
         let cursorStyle = seriesScope && seriesScope.cursorStyle;
 
         if (!seriesScope || data.hasItemOption) {
-            let itemModel = (seriesScope && seriesScope.itemModel)
+            const itemModel = (seriesScope && seriesScope.itemModel)
                 ? seriesScope.itemModel : data.getItemModel<SymbolDrawItemModelOption>(idx);
 
             // Color must be excluded.
@@ -246,7 +246,7 @@ class Symbol extends graphic.Group {
             hoverItemStyle = zrUtil.extend({}, hoverItemStyle);
         }
 
-        let elStyle = symbolPath.style;
+        const elStyle = symbolPath.style;
 
         symbolPath.attr('rotation', (symbolRotate || 0) * Math.PI / 180 || 0);
 
@@ -264,13 +264,13 @@ class Symbol extends graphic.Group {
 
         symbolPath.setStyle(itemStyle);
 
-        let opacity = data.getItemVisual(idx, 'opacity');
+        const opacity = data.getItemVisual(idx, 'opacity');
         if (opacity != null) {
             elStyle.opacity = opacity;
         }
 
-        let liftZ = data.getItemVisual(idx, 'liftZ');
-        let z2Origin = symbolPath.__z2Origin;
+        const liftZ = data.getItemVisual(idx, 'liftZ');
+        const z2Origin = symbolPath.__z2Origin;
         if (liftZ != null) {
             if (z2Origin == null) {
                 symbolPath.__z2Origin = symbolPath.z2;
@@ -282,7 +282,7 @@ class Symbol extends graphic.Group {
             symbolPath.__z2Origin = null;
         }
 
-        let useNameLabel = seriesScope && seriesScope.useNameLabel;
+        const useNameLabel = seriesScope && seriesScope.useNameLabel;
 
         graphic.setLabelStyle(
             symbolPath, labelModel, hoverLabelModel,
@@ -310,7 +310,7 @@ class Symbol extends graphic.Group {
     fadeOut(cb: () => void, opt?: {
         keepLabel: boolean
     }) {
-        let symbolPath = this.childAt(0) as ECSymbol;
+        const symbolPath = this.childAt(0) as ECSymbol;
         // Avoid mistaken hover when fading out
         this.silent = symbolPath.silent = true;
         // Not show text when animating
@@ -331,7 +331,7 @@ class Symbol extends graphic.Group {
     }
 
     static getSymbolSize(data: List, idx: number) {
-        let symbolSize = data.getItemVisual(idx, 'symbolSize');
+        const symbolSize = data.getItemVisual(idx, 'symbolSize');
         return symbolSize instanceof Array
             ? symbolSize.slice()
             : [+symbolSize, +symbolSize];
@@ -346,9 +346,9 @@ function highDownOnUpdate(this: ECSymbol, fromState: DisplayState, toState: Disp
     }
 
     if (toState === 'emphasis') {
-        let scale = this.__symbolOriginalScale;
-        let ratio = scale[1] / scale[0];
-        let emphasisOpt = {
+        const scale = this.__symbolOriginalScale;
+        const ratio = scale[1] / scale[0];
+        const emphasisOpt = {
             scale: [
                 Math.max(scale[0] * 1.1, scale[0] + 3),
                 Math.max(scale[1] * 1.1, scale[1] + 3 * ratio)
diff --git a/src/chart/helper/SymbolDraw.ts b/src/chart/helper/SymbolDraw.ts
index 1ff215d..3480e35 100644
--- a/src/chart/helper/SymbolDraw.ts
+++ b/src/chart/helper/SymbolDraw.ts
@@ -109,7 +109,7 @@ export interface SymbolDrawSeriesScope {
 }
 
 function makeSeriesScope(data: List): SymbolDrawSeriesScope {
-    let seriesModel = data.hostModel;
+    const seriesModel = data.hostModel;
     return {
         itemStyle: seriesModel.getModel('itemStyle').getItemStyle(['color']),
         hoverItemStyle: seriesModel.getModel(['emphasis', 'itemStyle']).getItemStyle(),
@@ -143,12 +143,12 @@ class SymbolDraw {
     updateData(data: ListForSymbolDraw, opt?: UpdateOpt) {
         opt = normalizeUpdateOpt(opt);
 
-        let group = this.group;
-        let seriesModel = data.hostModel;
-        let oldData = this._data;
-        let SymbolCtor = this._SymbolCtor;
+        const group = this.group;
+        const seriesModel = data.hostModel;
+        const oldData = this._data;
+        const SymbolCtor = this._SymbolCtor;
 
-        let seriesScope = makeSeriesScope(data);
+        const seriesScope = makeSeriesScope(data);
 
         // There is no oldLineData only when first rendering or switching from
         // stream mode to normal mode, where previous elements should be removed.
@@ -158,9 +158,9 @@ class SymbolDraw {
 
         data.diff(oldData)
             .add(function (newIdx) {
-                let point = data.getItemLayout(newIdx) as number[];
+                const point = data.getItemLayout(newIdx) as number[];
                 if (symbolNeedsDraw(data, point, newIdx, opt)) {
-                    let symbolEl = new SymbolCtor(data, newIdx, seriesScope);
+                    const symbolEl = new SymbolCtor(data, newIdx, seriesScope);
                     symbolEl.attr('position', point);
                     data.setItemGraphicEl(newIdx, symbolEl);
                     group.add(symbolEl);
@@ -168,7 +168,7 @@ class SymbolDraw {
             })
             .update(function (newIdx, oldIdx) {
                 let symbolEl = oldData.getItemGraphicEl(oldIdx) as SymbolLike;
-                let point = data.getItemLayout(newIdx) as number[];
+                const point = data.getItemLayout(newIdx) as number[];
                 if (!symbolNeedsDraw(data, point, newIdx, opt)) {
                     group.remove(symbolEl);
                     return;
@@ -190,7 +190,7 @@ class SymbolDraw {
                 data.setItemGraphicEl(newIdx, symbolEl);
             })
             .remove(function (oldIdx) {
-                let el = oldData.getItemGraphicEl(oldIdx) as SymbolLike;
+                const el = oldData.getItemGraphicEl(oldIdx) as SymbolLike;
                 el && el.fadeOut(function () {
                     group.remove(el);
                 });
@@ -205,11 +205,11 @@ class SymbolDraw {
     };
 
     updateLayout() {
-        let data = this._data;
+        const data = this._data;
         if (data) {
             // Not use animation
             data.eachItemGraphicEl(function (el, idx) {
-                let point = data.getItemLayout(idx);
+                const point = data.getItemLayout(idx);
                 el.attr('position', point);
             });
         }
@@ -233,9 +233,9 @@ class SymbolDraw {
             }
         }
         for (let idx = taskParams.start; idx < taskParams.end; idx++) {
-            let point = data.getItemLayout(idx) as number[];
+            const point = data.getItemLayout(idx) as number[];
             if (symbolNeedsDraw(data, point, idx, opt)) {
-                let el = new this._SymbolCtor(data, idx, this._seriesScope);
+                const el = new this._SymbolCtor(data, idx, this._seriesScope);
                 el.traverse(updateIncrementalAndHover);
                 el.attr('position', point);
                 this.group.add(el);
@@ -245,8 +245,8 @@ class SymbolDraw {
     };
 
     remove(enableAnimation?: boolean) {
-        let group = this.group;
-        let data = this._data;
+        const group = this.group;
+        const data = this._data;
         // Incremental model do not have this._data.
         if (data && enableAnimation) {
             data.eachItemGraphicEl(function (el: SymbolLike) {
diff --git a/src/chart/helper/createClipPathFromCoordSys.ts b/src/chart/helper/createClipPathFromCoordSys.ts
index febd702..2f2741b 100644
--- a/src/chart/helper/createClipPathFromCoordSys.ts
+++ b/src/chart/helper/createClipPathFromCoordSys.ts
@@ -32,22 +32,22 @@ function createGridClipPath(
     hasAnimation: boolean,
     seriesModel: SeriesModelWithLineWidth
 ) {
-    let rect = cartesian.getArea();
-    let isHorizontal = cartesian.getBaseAxis().isHorizontal();
+    const rect = cartesian.getArea();
+    const isHorizontal = cartesian.getBaseAxis().isHorizontal();
 
     let x = rect.x;
     let y = rect.y;
     let width = rect.width;
     let height = rect.height;
 
-    let lineWidth = seriesModel.get(['lineStyle', 'width']) || 2;
+    const lineWidth = seriesModel.get(['lineStyle', 'width']) || 2;
     // Expand the clip path a bit to avoid the border is clipped and looks thinner
     x -= lineWidth / 2;
     y -= lineWidth / 2;
     width += lineWidth;
     height += lineWidth;
 
-    let clipPath = new graphic.Rect({
+    const clipPath = new graphic.Rect({
         shape: {
             x: x,
             y: y,
@@ -74,10 +74,10 @@ function createPolarClipPath(
     hasAnimation: boolean,
     seriesModel: SeriesModelWithLineWidth
 ) {
-    let sectorArea = polar.getArea();
+    const sectorArea = polar.getArea();
     // Avoid float number rounding error for symbol on the edge of axis extent.
 
-    let clipPath = new graphic.Sector({
+    const clipPath = new graphic.Sector({
         shape: {
             cx: round(polar.cx, 1),
             cy: round(polar.cy, 1),
diff --git a/src/chart/helper/createGraphFromNodeEdge.ts b/src/chart/helper/createGraphFromNodeEdge.ts
index b59e57c..dac9dee 100644
--- a/src/chart/helper/createGraphFromNodeEdge.ts
+++ b/src/chart/helper/createGraphFromNodeEdge.ts
@@ -30,7 +30,7 @@ import createListFromArray from './createListFromArray';
 export default function (nodes, edges, seriesModel, directed, beforeLink) {
     // ??? TODO
     // support dataset?
-    let graph = new Graph(directed);
+    const graph = new Graph(directed);
     for (let i = 0; i < nodes.length; i++) {
         graph.addNode(zrUtil.retrieve(
             // Id, name, dataIndex
@@ -38,13 +38,13 @@ export default function (nodes, edges, seriesModel, directed, beforeLink) {
         ), i);
     }
 
-    let linkNameList = [];
-    let validEdges = [];
+    const linkNameList = [];
+    const validEdges = [];
     let linkCount = 0;
     for (let i = 0; i < edges.length; i++) {
-        let link = edges[i];
-        let source = link.source;
-        let target = link.target;
+        const link = edges[i];
+        const source = link.source;
+        const target = link.target;
         // addEdge may fail when source or target not exists
         if (graph.addEdge(source, target, linkCount)) {
             validEdges.push(link);
@@ -53,14 +53,14 @@ export default function (nodes, edges, seriesModel, directed, beforeLink) {
         }
     }
 
-    let coordSys = seriesModel.get('coordinateSystem');
+    const coordSys = seriesModel.get('coordinateSystem');
     let nodeData;
     if (coordSys === 'cartesian2d' || coordSys === 'polar') {
         nodeData = createListFromArray(nodes, seriesModel);
     }
     else {
-        let coordSysCtor = CoordinateSystem.get(coordSys);
-        let coordDimensions = (coordSysCtor && coordSysCtor.type !== 'view')
+        const coordSysCtor = CoordinateSystem.get(coordSys);
+        const coordDimensions = (coordSysCtor && coordSysCtor.type !== 'view')
             ? (coordSysCtor.dimensions || []) : [];
         // FIXME: Some geo do not need `value` dimenson, whereas `calendar` needs
         // `value` dimension, but graph need `value` dimension. It's better to
@@ -69,14 +69,14 @@ export default function (nodes, edges, seriesModel, directed, beforeLink) {
             coordDimensions.concat(['value']);
         }
 
-        let dimensionNames = createDimensions(nodes, {
+        const dimensionNames = createDimensions(nodes, {
             coordDimensions: coordDimensions
         });
         nodeData = new List(dimensionNames, seriesModel);
         nodeData.initData(nodes);
     }
 
-    let edgeData = new List(['value'], seriesModel);
+    const edgeData = new List(['value'], seriesModel);
     edgeData.initData(validEdges, linkNameList);
 
     beforeLink && beforeLink(nodeData, edgeData);
diff --git a/src/chart/helper/createListFromArray.ts b/src/chart/helper/createListFromArray.ts
index 42b3e50..d55bf3b 100644
--- a/src/chart/helper/createListFromArray.ts
+++ b/src/chart/helper/createListFromArray.ts
@@ -40,21 +40,21 @@ function createListFromArray(source: Source | any[], seriesModel: SeriesModel, o
         source = Source.seriesDataToSource(source);
     }
 
-    let coordSysName = seriesModel.get('coordinateSystem');
-    let registeredCoordSys = CoordinateSystem.get(coordSysName);
+    const coordSysName = seriesModel.get('coordinateSystem');
+    const registeredCoordSys = CoordinateSystem.get(coordSysName);
 
-    let coordSysInfo = getCoordSysInfoBySeries(seriesModel);
+    const coordSysInfo = getCoordSysInfoBySeries(seriesModel);
 
     let coordSysDimDefs: DimensionDefinitionLoose[];
 
     if (coordSysInfo) {
         coordSysDimDefs = zrUtil.map(coordSysInfo.coordSysDims, function (dim) {
-            let dimInfo = {
+            const dimInfo = {
                 name: dim
             } as DimensionDefinition;
-            let axisModel = coordSysInfo.axisMap.get(dim);
+            const axisModel = coordSysInfo.axisMap.get(dim);
             if (axisModel) {
-                let axisType = axisModel.get('type');
+                const axisType = axisModel.get('type');
                 dimInfo.type = getDimensionTypeByAxis(axisType);
                 // dimInfo.stackable = isStackable(axisType);
             }
@@ -71,7 +71,7 @@ function createListFromArray(source: Source | any[], seriesModel: SeriesModel, o
         )) || ['x', 'y'];
     }
 
-    let dimInfoList = createDimensions(source, {
+    const dimInfoList = createDimensions(source, {
         coordDimensions: coordSysDimDefs,
         generateCoord: opt.generateCoord,
         encodeDefaulter: opt.useEncodeDefaulter
@@ -82,8 +82,8 @@ function createListFromArray(source: Source | any[], seriesModel: SeriesModel, o
     let firstCategoryDimIndex: number;
     let hasNameEncode: boolean;
     coordSysInfo && zrUtil.each(dimInfoList, function (dimInfo, dimIndex) {
-        let coordDim = dimInfo.coordDim;
-        let categoryAxisModel = coordSysInfo.categoryAxisMap.get(coordDim);
+        const coordDim = dimInfo.coordDim;
+        const categoryAxisModel = coordSysInfo.categoryAxisMap.get(coordDim);
         if (categoryAxisModel) {
             if (firstCategoryDimIndex == null) {
                 firstCategoryDimIndex = dimIndex;
@@ -98,13 +98,13 @@ function createListFromArray(source: Source | any[], seriesModel: SeriesModel, o
         dimInfoList[firstCategoryDimIndex].otherDims.itemName = 0;
     }
 
-    let stackCalculationInfo = enableDataStack(seriesModel, dimInfoList);
+    const stackCalculationInfo = enableDataStack(seriesModel, dimInfoList);
 
-    let list = new List(dimInfoList, seriesModel);
+    const list = new List(dimInfoList, seriesModel);
 
     list.setCalculationInfo(stackCalculationInfo);
 
-    let dimValueGetter = (firstCategoryDimIndex != null && isNeedCompleteOrdinalData(source))
+    const dimValueGetter = (firstCategoryDimIndex != null && isNeedCompleteOrdinalData(source))
         ? function (this: List, itemOpt: any, dimName: string, dataIndex: number, dimIndex: number) {
             // Use dataIndex as ordinal value in categoryAxis
             return dimIndex === firstCategoryDimIndex
@@ -121,7 +121,7 @@ function createListFromArray(source: Source | any[], seriesModel: SeriesModel, o
 
 function isNeedCompleteOrdinalData(source: Source) {
     if (source.sourceFormat === SOURCE_FORMAT_ORIGINAL) {
-        let sampleItem = firstDataNotNull(source.data as ArrayLike<any> || []);
+        const sampleItem = firstDataNotNull(source.data as ArrayLike<any> || []);
         return sampleItem != null
             && !zrUtil.isArray(getDataItemValue(sampleItem));
     }
diff --git a/src/chart/helper/createListSimply.ts b/src/chart/helper/createListSimply.ts
index ac27f00..fb50f95 100644
--- a/src/chart/helper/createListSimply.ts
+++ b/src/chart/helper/createListSimply.ts
@@ -39,11 +39,11 @@ export default function (
 ): List {
     opt = isArray(opt) && {coordDimensions: opt} || extend({}, opt);
 
-    let source = seriesModel.getSource();
+    const source = seriesModel.getSource();
 
-    let dimensionsInfo = createDimensions(source, opt as CreateDimensionsParams);
+    const dimensionsInfo = createDimensions(source, opt as CreateDimensionsParams);
 
-    let list = new List(dimensionsInfo, seriesModel);
+    const list = new List(dimensionsInfo, seriesModel);
     list.initData(source, nameList);
 
     return list;
diff --git a/src/chart/helper/createRenderPlanner.ts b/src/chart/helper/createRenderPlanner.ts
index 15d4465..bdf564d 100644
--- a/src/chart/helper/createRenderPlanner.ts
+++ b/src/chart/helper/createRenderPlanner.ts
@@ -27,20 +27,20 @@ import { StageHandlerPlanReturn } from '../../util/types';
  * @return {string} If large mode changed, return string 'reset';
  */
 export default function () {
-    let inner = makeInner();
+    const inner = makeInner();
 
     return function (seriesModel: SeriesModel): StageHandlerPlanReturn {
-        let fields = inner(seriesModel);
-        let pipelineContext = seriesModel.pipelineContext;
+        const fields = inner(seriesModel);
+        const pipelineContext = seriesModel.pipelineContext;
 
-        let originalLarge = fields.large;
-        let originalProgressive = fields.progressiveRender;
+        const originalLarge = fields.large;
+        const originalProgressive = fields.progressiveRender;
 
         // FIXME: if the planner works on a filtered series, `pipelineContext` does not
         // exists. See #11611 . Probably we need to modify this structure, see the comment
         // on `performRawSeries` in `Schedular.js`.
-        let large = fields.large = pipelineContext && pipelineContext.large;
-        let progressive = fields.progressiveRender = pipelineContext && pipelineContext.progressiveRender;
+        const large = fields.large = pipelineContext && pipelineContext.large;
+        const progressive = fields.progressiveRender = pipelineContext && pipelineContext.progressiveRender;
 
         return (
             !!((originalLarge ^ large as any) || (originalProgressive ^ progressive as any)) && 'reset'
diff --git a/src/chart/helper/labelHelper.ts b/src/chart/helper/labelHelper.ts
index 1273e98..595780e 100644
--- a/src/chart/helper/labelHelper.ts
+++ b/src/chart/helper/labelHelper.ts
@@ -25,17 +25,17 @@ import List from '../../data/List';
  * @return label string. Not null/undefined
  */
 export function getDefaultLabel(data: List, dataIndex: number): string {
-    let labelDims = data.mapDimension('defaultedLabel', true);
-    let len = labelDims.length;
+    const labelDims = data.mapDimension('defaultedLabel', true);
+    const len = labelDims.length;
 
     // Simple optimization (in lots of cases, label dims length is 1)
     if (len === 1) {
         return retrieveRawValue(data, dataIndex, labelDims[0]);
     }
     else if (len) {
-        let vals = [];
+        const vals = [];
         for (let i = 0; i < labelDims.length; i++) {
-            let val = retrieveRawValue(data, dataIndex, labelDims[i]);
+            const val = retrieveRawValue(data, dataIndex, labelDims[i]);
             vals.push(val);
         }
         return vals.join(' ');
diff --git a/src/chart/helper/treeHelper.ts b/src/chart/helper/treeHelper.ts
index cb94b17..1a4a701 100644
--- a/src/chart/helper/treeHelper.ts
+++ b/src/chart/helper/treeHelper.ts
@@ -31,7 +31,7 @@ export function retrieveTargetInfo(
     seriesModel: SeriesModel
 ) {
     if (payload && zrUtil.indexOf(validPayloadTypes, payload.type) >= 0) {
-        let root = seriesModel.getData().tree.root;
+        const root = seriesModel.getData().tree.root;
         let targetNode = payload.targetNode;
 
         if (typeof targetNode === 'string') {
@@ -44,7 +44,7 @@ export function retrieveTargetInfo(
             };
         }
 
-        let targetNodeId = payload.targetNodeId;
+        const targetNodeId = payload.targetNodeId;
         if (targetNodeId != null && (targetNode = root.getNodeById(targetNodeId))) {
             return {
                 node: targetNode
@@ -55,7 +55,7 @@ export function retrieveTargetInfo(
 
 // Not includes the given node at the last item.
 export function getPathToRoot(node: TreeNode): TreeNode[] {
-    let path = [];
+    const path = [];
     while (node) {
         node = node.parentNode;
         node && path.push(node);
@@ -64,17 +64,17 @@ export function getPathToRoot(node: TreeNode): TreeNode[] {
 }
 
 export function aboveViewRoot(viewRoot: TreeNode, node: TreeNode) {
-    let viewPath = getPathToRoot(viewRoot);
+    const viewPath = getPathToRoot(viewRoot);
     return zrUtil.indexOf(viewPath, node) >= 0;
 }
 
 
 // From root to the input node (the input node will be included).
 export function wrapTreePathInfo<T = unknown>(node: TreeNode, seriesModel: SeriesModel) {
-    let treePathInfo = [];
+    const treePathInfo = [];
 
     while (node) {
-        let nodeDataIndex = node.dataIndex;
+        const nodeDataIndex = node.dataIndex;
         treePathInfo.push({
             name: node.name,
             dataIndex: nodeDataIndex,
diff --git a/src/chart/helper/whiskerBoxCommon.ts b/src/chart/helper/whiskerBoxCommon.ts
index 039d1f7..31dcec9 100644
--- a/src/chart/helper/whiskerBoxCommon.ts
+++ b/src/chart/helper/whiskerBoxCommon.ts
@@ -62,10 +62,10 @@ class WhiskerBoxCommonMixin<Opts extends CommonOption> {
 
         let ordinalMeta;
 
-        let xAxisModel = ecModel.getComponent('xAxis', this.get('xAxisIndex')) as CartesianAxisModel;
-        let yAxisModel = ecModel.getComponent('yAxis', this.get('yAxisIndex')) as CartesianAxisModel;
-        let xAxisType = xAxisModel.get('type');
-        let yAxisType = yAxisModel.get('type');
+        const xAxisModel = ecModel.getComponent('xAxis', this.get('xAxisIndex')) as CartesianAxisModel;
+        const yAxisModel = ecModel.getComponent('yAxis', this.get('yAxisIndex')) as CartesianAxisModel;
+        const xAxisType = xAxisModel.get('type');
+        const yAxisType = yAxisModel.get('type');
         let addOrdinal;
 
         // FIXME
@@ -85,19 +85,19 @@ class WhiskerBoxCommonMixin<Opts extends CommonOption> {
             option.layout = option.layout || 'horizontal';
         }
 
-        let coordDims = ['x', 'y'];
-        let baseAxisDimIndex = option.layout === 'horizontal' ? 0 : 1;
-        let baseAxisDim = this._baseAxisDim = coordDims[baseAxisDimIndex];
-        let otherAxisDim = coordDims[1 - baseAxisDimIndex];
-        let axisModels = [xAxisModel, yAxisModel];
-        let baseAxisType = axisModels[baseAxisDimIndex].get('type');
-        let otherAxisType = axisModels[1 - baseAxisDimIndex].get('type');
-        let data = option.data as WhiskerBoxCommonData;
+        const coordDims = ['x', 'y'];
+        const baseAxisDimIndex = option.layout === 'horizontal' ? 0 : 1;
+        const baseAxisDim = this._baseAxisDim = coordDims[baseAxisDimIndex];
+        const otherAxisDim = coordDims[1 - baseAxisDimIndex];
+        const axisModels = [xAxisModel, yAxisModel];
+        const baseAxisType = axisModels[baseAxisDimIndex].get('type');
+        const otherAxisType = axisModels[1 - baseAxisDimIndex].get('type');
+        const data = option.data as WhiskerBoxCommonData;
 
         // ??? FIXME make a stage to perform data transfrom.
         // MUST create a new data, consider setOption({}) again.
         if (data && addOrdinal) {
-            let newOptionData: WhiskerBoxCommonData = [];
+            const newOptionData: WhiskerBoxCommonData = [];
             zrUtil.each(data, function (item, index) {
                 let newItem;
                 if (zrUtil.isArray(item)) {
@@ -116,8 +116,8 @@ class WhiskerBoxCommonMixin<Opts extends CommonOption> {
             option.data = newOptionData;
         }
 
-        let defaultValueDimensions = this.defaultValueDimensions;
-        let coordDimensions = [{
+        const defaultValueDimensions = this.defaultValueDimensions;
+        const coordDimensions = [{
             name: baseAxisDim,
             type: getDimensionTypeByAxis(baseAxisType),
             ordinalMeta: ordinalMeta,
@@ -149,7 +149,7 @@ class WhiskerBoxCommonMixin<Opts extends CommonOption> {
      * @override
      */
     getBaseAxis(): Axis2D {
-        let dim = this._baseAxisDim;
+        const dim = this._baseAxisDim;
         return (this.ecModel.getComponent(
             dim + 'Axis', this.get(dim + 'AxisIndex' as 'xAxisIndex' | 'yAxisIndex')
         ) as CartesianAxisModel).axis;
diff --git a/src/chart/line/LineSeries.ts b/src/chart/line/LineSeries.ts
index 2f268da..c53aa8c 100644
--- a/src/chart/line/LineSeries.ts
+++ b/src/chart/line/LineSeries.ts
@@ -105,7 +105,7 @@ class LineSeriesModel extends SeriesModel<LineSeriesOption> {
 
     getInitialData(option: LineSeriesOption): List {
         if (__DEV__) {
-            let coordSys = option.coordinateSystem;
+            const coordSys = option.coordinateSystem;
             if (coordSys !== 'polar' && coordSys !== 'cartesian2d') {
                 throw new Error('Line not support coordinateSystem besides cartesian and polar');
             }
diff --git a/src/chart/line/LineView.ts b/src/chart/line/LineView.ts
index 0d4ef91..63e4c56 100644
--- a/src/chart/line/LineView.ts
+++ b/src/chart/line/LineView.ts
@@ -56,8 +56,8 @@ function isPointsSame(points1: number[][], points2: number[][]) {
         return;
     }
     for (let i = 0; i < points1.length; i++) {
-        let p1 = points1[i];
-        let p2 = points2[i];
+        const p1 = points1[i];
+        const p2 = points2[i];
         if (p1[0] !== p2[0] || p1[1] !== p2[1]) {
             return;
         }
@@ -78,7 +78,7 @@ function getStackedOnPoints(
         return [];
     }
 
-    let points = [];
+    const points = [];
     for (let idx = 0, len = data.count(); idx < len; idx++) {
         points.push(getStackedOnPoint(dataCoordInfo, coordSys, data, idx));
     }
@@ -91,17 +91,17 @@ function turnPointsIntoStep(
     coordSys: Cartesian2D | Polar,
     stepTurnAt: 'start' | 'end' | 'middle'
 ) {
-    let baseAxis = coordSys.getBaseAxis();
-    let baseIndex = baseAxis.dim === 'x' || baseAxis.dim === 'radius' ? 0 : 1;
+    const baseAxis = coordSys.getBaseAxis();
+    const baseIndex = baseAxis.dim === 'x' || baseAxis.dim === 'radius' ? 0 : 1;
 
-    let stepPoints = [];
+    const stepPoints = [];
     let i = 0;
     for (; i < points.length - 1; i++) {
-        let nextPt = points[i + 1];
-        let pt = points[i];
+        const nextPt = points[i + 1];
+        const pt = points[i];
         stepPoints.push(pt);
 
-        let stepPt = [];
+        const stepPt = [];
         switch (stepTurnAt) {
             case 'end':
                 stepPt[baseIndex] = nextPt[baseIndex];
@@ -111,8 +111,8 @@ function turnPointsIntoStep(
                 break;
             case 'middle':
                 // default is start
-                let middle = (pt[baseIndex] + nextPt[baseIndex]) / 2;
-                let stepPt2 = [];
+                const middle = (pt[baseIndex] + nextPt[baseIndex]) / 2;
+                const stepPt2 = [];
                 stepPt[baseIndex] = stepPt2[baseIndex] = middle;
                 stepPt[1 - baseIndex] = pt[1 - baseIndex];
                 stepPt2[1 - baseIndex] = nextPt[1 - baseIndex];
@@ -135,7 +135,7 @@ function getVisualGradient(
     data: List,
     coordSys: Cartesian2D | Polar
 ) {
-    let visualMetaList = data.getVisual('visualMeta') as VisualMeta[];
+    const visualMetaList = data.getVisual('visualMeta') as VisualMeta[];
     if (!visualMetaList || !visualMetaList.length || !data.count()) {
         // When data.count() is 0, gradient range can not be calculated.
         return;
@@ -152,9 +152,9 @@ function getVisualGradient(
     let visualMeta;
 
     for (let i = visualMetaList.length - 1; i >= 0; i--) {
-        let dimIndex = visualMetaList[i].dimension;
-        let dimName = data.dimensions[dimIndex];
-        let dimInfo = data.getDimensionInfo(dimName);
+        const dimIndex = visualMetaList[i].dimension;
+        const dimName = data.dimensions[dimIndex];
+        const dimInfo = data.getDimensionInfo(dimName);
         coordDim = (dimInfo && dimInfo.coordDim) as 'x' | 'y';
         // Can only be x or y
         if (coordDim === 'x' || coordDim === 'y') {
@@ -177,7 +177,7 @@ function getVisualGradient(
     // LinearGradient. So we can only infinitesimally extend area defined in
     // LinearGradient to render `outerColors`.
 
-    let axis = coordSys.getAxis(coordDim);
+    const axis = coordSys.getAxis(coordDim);
 
     interface ColorStop {
         offset: number
@@ -185,25 +185,25 @@ function getVisualGradient(
         color: ColorString
     }
     // dataToCoor mapping may not be linear, but must be monotonic.
-    let colorStops: ColorStop[] = zrUtil.map(visualMeta.stops, function (stop) {
+    const colorStops: ColorStop[] = zrUtil.map(visualMeta.stops, function (stop) {
         return {
             offset: 0,
             coord: axis.toGlobalCoord(axis.dataToCoord(stop.value)),
             color: stop.color
         };
     });
-    let stopLen = colorStops.length;
-    let outerColors = visualMeta.outerColors.slice();
+    const stopLen = colorStops.length;
+    const outerColors = visualMeta.outerColors.slice();
 
     if (stopLen && colorStops[0].coord > colorStops[stopLen - 1].coord) {
         colorStops.reverse();
         outerColors.reverse();
     }
 
-    let tinyExtent = 10; // Arbitrary value: 10px
-    let minCoord = colorStops[0].coord - tinyExtent;
-    let maxCoord = colorStops[stopLen - 1].coord + tinyExtent;
-    let coordSpan = maxCoord - minCoord;
+    const tinyExtent = 10; // Arbitrary value: 10px
+    const minCoord = colorStops[0].coord - tinyExtent;
+    const maxCoord = colorStops[stopLen - 1].coord + tinyExtent;
+    const coordSpan = maxCoord - minCoord;
 
     if (coordSpan < 1e-3) {
         return 'transparent';
@@ -226,7 +226,7 @@ function getVisualGradient(
     //     colorStop.offset = (Math.round(colorStop.offset * (end - start) + start) - start) / (end - start);
     // });
 
-    let gradient = new graphic.LinearGradient(0, 0, 0, 0, colorStops, true);
+    const gradient = new graphic.LinearGradient(0, 0, 0, 0, colorStops, true);
     gradient[coordDim] = minCoord;
     gradient[coordDim + '2' as 'x2' | 'y2'] = maxCoord;
 
@@ -238,14 +238,14 @@ function getIsIgnoreFunc(
     data: List,
     coordSys: Cartesian2D
 ) {
-    let showAllSymbol = seriesModel.get('showAllSymbol');
-    let isAuto = showAllSymbol === 'auto';
+    const showAllSymbol = seriesModel.get('showAllSymbol');
+    const isAuto = showAllSymbol === 'auto';
 
     if (showAllSymbol && !isAuto) {
         return;
     }
 
-    let categoryAxis = coordSys.getAxesByScale('ordinal')[0];
+    const categoryAxis = coordSys.getAxesByScale('ordinal')[0];
     if (!categoryAxis) {
         return;
     }
@@ -261,8 +261,8 @@ function getIsIgnoreFunc(
     }
 
     // Otherwise follow the label interval strategy on category axis.
-    let categoryDataDim = data.mapDimension(categoryAxis.dim);
-    let labelMap: Dictionary<1> = {};
+    const categoryDataDim = data.mapDimension(categoryAxis.dim);
+    const labelMap: Dictionary<1> = {};
 
     zrUtil.each(categoryAxis.getViewLabels(), function (labelItem) {
         labelMap[labelItem.tickValue] = 1;
@@ -281,13 +281,13 @@ function canShowAllSymbolForCategory(
     // is close with each other. So we check the symbol size and some of the
     // label size alone with the category axis to estimate whether all symbol
     // can be shown without overlap.
-    let axisExtent = categoryAxis.getExtent();
+    const axisExtent = categoryAxis.getExtent();
     let availSize = Math.abs(axisExtent[1] - axisExtent[0]) / (categoryAxis.scale as OrdinalScale).count();
     isNaN(availSize) && (availSize = 0); // 0/0 is NaN.
 
     // Sampling some points, max 5.
-    let dataLen = data.count();
-    let step = Math.max(1, Math.round(dataLen / 5));
+    const dataLen = data.count();
+    const step = Math.max(1, Math.round(dataLen / 5));
     for (let dataIndex = 0; dataIndex < dataLen; dataIndex += step) {
         if (SymbolClz.getSymbolSize(
                 data, dataIndex
@@ -309,12 +309,12 @@ function createLineClipPath(
     seriesModel: LineSeriesModel
 ) {
     if (coordSys.type === 'cartesian2d') {
-        let isHorizontal = coordSys.getBaseAxis().isHorizontal();
-        let clipPath = createGridClipPath(coordSys, hasAnimation, seriesModel);
+        const isHorizontal = coordSys.getBaseAxis().isHorizontal();
+        const clipPath = createGridClipPath(coordSys, hasAnimation, seriesModel);
         // Expand clip shape to avoid clipping when line value exceeds axis
         if (!seriesModel.get('clip', true)) {
-            let rectShape = clipPath.shape;
-            let expandSize = Math.max(rectShape.width, rectShape.height);
+            const rectShape = clipPath.shape;
+            const expandSize = Math.max(rectShape.width, rectShape.height);
             if (isHorizontal) {
                 rectShape.y -= expandSize;
                 rectShape.height += expandSize * 2;
@@ -355,9 +355,9 @@ class LineView extends ChartView {
     _data: List;
 
     init() {
-        let lineGroup = new graphic.Group();
+        const lineGroup = new graphic.Group();
 
-        let symbolDraw = new SymbolDraw();
+        const symbolDraw = new SymbolDraw();
         this.group.add(symbolDraw.group);
 
         this._symbolDraw = symbolDraw;
@@ -365,39 +365,39 @@ class LineView extends ChartView {
     }
 
     render(seriesModel: LineSeriesModel, ecModel: GlobalModel, api: ExtensionAPI) {
-        let coordSys = seriesModel.coordinateSystem;
-        let group = this.group;
-        let data = seriesModel.getData();
-        let lineStyleModel = seriesModel.getModel('lineStyle');
-        let areaStyleModel = seriesModel.getModel('areaStyle');
+        const coordSys = seriesModel.coordinateSystem;
+        const group = this.group;
+        const data = seriesModel.getData();
+        const lineStyleModel = seriesModel.getModel('lineStyle');
+        const areaStyleModel = seriesModel.getModel('areaStyle');
 
         let points = data.mapArray(data.getItemLayout);
 
-        let isCoordSysPolar = coordSys.type === 'polar';
-        let prevCoordSys = this._coordSys;
+        const isCoordSysPolar = coordSys.type === 'polar';
+        const prevCoordSys = this._coordSys;
 
-        let symbolDraw = this._symbolDraw;
+        const symbolDraw = this._symbolDraw;
         let polyline = this._polyline;
         let polygon = this._polygon;
 
-        let lineGroup = this._lineGroup;
+        const lineGroup = this._lineGroup;
 
-        let hasAnimation = seriesModel.get('animation');
+        const hasAnimation = seriesModel.get('animation');
 
-        let isAreaChart = !areaStyleModel.isEmpty();
+        const isAreaChart = !areaStyleModel.isEmpty();
 
-        let valueOrigin = areaStyleModel.get('origin');
-        let dataCoordInfo = prepareDataCoordInfo(coordSys, data, valueOrigin);
+        const valueOrigin = areaStyleModel.get('origin');
+        const dataCoordInfo = prepareDataCoordInfo(coordSys, data, valueOrigin);
 
         let stackedOnPoints = getStackedOnPoints(coordSys, data, dataCoordInfo);
 
-        let showSymbol = seriesModel.get('showSymbol');
+        const showSymbol = seriesModel.get('showSymbol');
 
-        let isIgnoreFunc = showSymbol && !isCoordSysPolar
+        const isIgnoreFunc = showSymbol && !isCoordSysPolar
             && getIsIgnoreFunc(seriesModel, data, coordSys as Cartesian2D);
 
         // Remove temporary symbols
-        let oldData = this._data;
+        const oldData = this._data;
         oldData && oldData.eachItemGraphicEl(function (el: SymbolExtended, idx) {
             if (el.__temp) {
                 group.remove(el);
@@ -413,7 +413,7 @@ class LineView extends ChartView {
         group.add(lineGroup);
 
         // FIXME step not support polar
-        let step = !isCoordSysPolar ? seriesModel.get('step') : false;
+        const step = !isCoordSysPolar ? seriesModel.get('step') : false;
         let clipShapeForSymbol: PolarArea | Cartesian2DArea;
         if (coordSys && coordSys.getArea && seriesModel.get('clip', true)) {
             clipShapeForSymbol = coordSys.getArea();
@@ -512,7 +512,7 @@ class LineView extends ChartView {
             }
         }
 
-        let visualColor = getVisualGradient(data, coordSys) || data.getVisual('color');
+        const visualColor = getVisualGradient(data, coordSys) || data.getVisual('color');
 
         polyline.useStyle(zrUtil.defaults(
             // Use color in lineStyle first
@@ -524,7 +524,7 @@ class LineView extends ChartView {
             }
         ));
 
-        let smooth = getSmooth(seriesModel.get('smooth'));
+        const smooth = getSmooth(seriesModel.get('smooth'));
         polyline.setShape({
             smooth: smooth,
             smoothMonotone: seriesModel.get('smoothMonotone'),
@@ -532,7 +532,7 @@ class LineView extends ChartView {
         });
 
         if (polygon) {
-            let stackedOnSeries = data.getCalculationInfo('stackedOnSeries');
+            const stackedOnSeries = data.getCalculationInfo('stackedOnSeries');
             let stackedOnSmooth = 0;
 
             polygon.useStyle(zrUtil.defaults(
@@ -573,14 +573,14 @@ class LineView extends ChartView {
         api: ExtensionAPI,
         payload: Payload
     ) {
-        let data = seriesModel.getData();
-        let dataIndex = modelUtil.queryDataIndex(data, payload);
+        const data = seriesModel.getData();
+        const dataIndex = modelUtil.queryDataIndex(data, payload);
 
         if (!(dataIndex instanceof Array) && dataIndex != null && dataIndex >= 0) {
             let symbol = data.getItemGraphicEl(dataIndex) as SymbolClz;
             if (!symbol) {
                 // Create a temporary symbol if it is not exists
-                let pt = data.getItemLayout(dataIndex) as number[];
+                const pt = data.getItemLayout(dataIndex) as number[];
                 if (!pt) {
                     // Null data
                     return;
@@ -620,10 +620,10 @@ class LineView extends ChartView {
         api: ExtensionAPI,
         payload: Payload
     ) {
-        let data = seriesModel.getData();
-        let dataIndex = modelUtil.queryDataIndex(data, payload) as number;
+        const data = seriesModel.getData();
+        const dataIndex = modelUtil.queryDataIndex(data, payload) as number;
         if (dataIndex != null && dataIndex >= 0) {
-            let symbol = data.getItemGraphicEl(dataIndex) as SymbolExtended;
+            const symbol = data.getItemGraphicEl(dataIndex) as SymbolExtended;
             if (symbol) {
                 if (symbol.__temp) {
                     data.setItemGraphicEl(dataIndex, null);
@@ -699,11 +699,11 @@ class LineView extends ChartView {
         step: LineSeriesOption['step'],
         valueOrigin: LineSeriesOption['areaStyle']['origin']
     ) {
-        let polyline = this._polyline;
-        let polygon = this._polygon;
-        let seriesModel = data.hostModel;
+        const polyline = this._polyline;
+        const polygon = this._polygon;
+        const seriesModel = data.hostModel;
 
-        let diff = lineAnimationDiff(
+        const diff = lineAnimationDiff(
             this._data, data,
             this._stackedOnPoints, stackedOnPoints,
             this._coordSys, coordSys,
@@ -746,16 +746,16 @@ class LineView extends ChartView {
             }, seriesModel);
         }
 
-        let updatedDataInfo: {
+        const updatedDataInfo: {
             el: SymbolExtended,
             ptIdx: number
         }[] = [];
-        let diffStatus = diff.status;
+        const diffStatus = diff.status;
 
         for (let i = 0; i < diffStatus.length; i++) {
-            let cmd = diffStatus[i].cmd;
+            const cmd = diffStatus[i].cmd;
             if (cmd === '=') {
-                let el = data.getItemGraphicEl(diffStatus[i].idx1) as SymbolExtended;
+                const el = data.getItemGraphicEl(diffStatus[i].idx1) as SymbolExtended;
                 if (el) {
                     updatedDataInfo.push({
                         el: el,
@@ -768,7 +768,7 @@ class LineView extends ChartView {
         if (polyline.animators && polyline.animators.length) {
             polyline.animators[0].during(function () {
                 for (let i = 0; i < updatedDataInfo.length; i++) {
-                    let el = updatedDataInfo[i].el;
+                    const el = updatedDataInfo[i].el;
                     el.attr('position', (polyline.shape as any).__points[updatedDataInfo[i].ptIdx]);
                 }
             });
@@ -776,8 +776,8 @@ class LineView extends ChartView {
     }
 
     remove(ecModel: GlobalModel) {
-        let group = this.group;
-        let oldData = this._data;
+        const group = this.group;
+        const oldData = this._data;
         this._lineGroup.removeAll();
         this._symbolDraw.remove(true);
         // Remove temporary created elements when highlighting
diff --git a/src/chart/line/helper.ts b/src/chart/line/helper.ts
index 916e953..edaccc5 100644
--- a/src/chart/line/helper.ts
+++ b/src/chart/line/helper.ts
@@ -42,22 +42,22 @@ export function prepareDataCoordInfo(
     data: List,
     valueOrigin?: LineSeriesOption['areaStyle']['origin']
 ): CoordInfo {
-    let baseAxis = coordSys.getBaseAxis();
-    let valueAxis = coordSys.getOtherAxis(baseAxis as any);
-    let valueStart = getValueStart(valueAxis, valueOrigin);
+    const baseAxis = coordSys.getBaseAxis();
+    const valueAxis = coordSys.getOtherAxis(baseAxis as any);
+    const valueStart = getValueStart(valueAxis, valueOrigin);
 
-    let baseAxisDim = baseAxis.dim;
-    let valueAxisDim = valueAxis.dim;
-    let valueDim = data.mapDimension(valueAxisDim);
-    let baseDim = data.mapDimension(baseAxisDim);
-    let baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0;
+    const baseAxisDim = baseAxis.dim;
+    const valueAxisDim = valueAxis.dim;
+    const valueDim = data.mapDimension(valueAxisDim);
+    const baseDim = data.mapDimension(baseAxisDim);
+    const baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0;
 
-    let dims = map(coordSys.dimensions, function (coordDim) {
+    const dims = map(coordSys.dimensions, function (coordDim) {
         return data.mapDimension(coordDim);
     });
 
     let stacked = false;
-    let stackResultDim = data.getCalculationInfo('stackResultDimension');
+    const stackResultDim = data.getCalculationInfo('stackResultDimension');
     if (isDimensionStacked(data, dims[0] /*, dims[1]*/)) { // jshint ignore:line
         stacked = true;
         dims[0] = stackResultDim;
@@ -82,7 +82,7 @@ export function prepareDataCoordInfo(
 
 function getValueStart(valueAxis: Axis, valueOrigin: LineSeriesOption['areaStyle']['origin']) {
     let valueStart = 0;
-    let extent = valueAxis.scale.getExtent();
+    const extent = valueAxis.scale.getExtent();
 
     if (valueOrigin === 'start') {
         valueStart = extent[0];
@@ -120,8 +120,8 @@ export function getStackedOnPoint(
         value = dataCoordInfo.valueStart;
     }
 
-    let baseDataOffset = dataCoordInfo.baseDataOffset;
-    let stackedData = [];
+    const baseDataOffset = dataCoordInfo.baseDataOffset;
+    const stackedData = [];
     stackedData[baseDataOffset] = data.get(dataCoordInfo.baseDim, idx);
     stackedData[1 - baseDataOffset] = value;
 
diff --git a/src/chart/line/lineAnimationDiff.ts b/src/chart/line/lineAnimationDiff.ts
index f003b99..9e164ef 100644
--- a/src/chart/line/lineAnimationDiff.ts
+++ b/src/chart/line/lineAnimationDiff.ts
@@ -30,7 +30,7 @@ interface DiffItem {
 }
 
 function diffData(oldData: List, newData: List) {
-    let diffResult: DiffItem[] = [];
+    const diffResult: DiffItem[] = [];
 
     newData.diff(oldData)
         .add(function (idx) {
@@ -54,7 +54,7 @@ export default function (
     oldValueOrigin: LineSeriesOption['areaStyle']['origin'],
     newValueOrigin: LineSeriesOption['areaStyle']['origin']
 ) {
-    let diff = diffData(oldData, newData);
+    const diff = diffData(oldData, newData);
 
     // let newIdList = newData.mapArray(newData.getId);
     // let oldIdList = oldData.mapArray(oldData.getId);
@@ -64,21 +64,21 @@ export default function (
     // // FIXME One data ?
     // diff = arrayDiff(oldIdList, newIdList);
 
-    let currPoints: number[][] = [];
-    let nextPoints: number[][] = [];
+    const currPoints: number[][] = [];
+    const nextPoints: number[][] = [];
     // Points for stacking base line
-    let currStackedPoints: number[][] = [];
-    let nextStackedPoints: number[][] = [];
+    const currStackedPoints: number[][] = [];
+    const nextStackedPoints: number[][] = [];
 
-    let status = [];
-    let sortedIndices: number[] = [];
-    let rawIndices: number[] = [];
+    const status = [];
+    const sortedIndices: number[] = [];
+    const rawIndices: number[] = [];
 
-    let newDataOldCoordInfo = prepareDataCoordInfo(oldCoordSys, newData, oldValueOrigin);
-    let oldDataNewCoordInfo = prepareDataCoordInfo(newCoordSys, oldData, newValueOrigin);
+    const newDataOldCoordInfo = prepareDataCoordInfo(oldCoordSys, newData, oldValueOrigin);
+    const oldDataNewCoordInfo = prepareDataCoordInfo(newCoordSys, oldData, newValueOrigin);
 
     for (let i = 0; i < diff.length; i++) {
-        let diffItem = diff[i];
+        const diffItem = diff[i];
         let pointAdded = true;
 
         // FIXME, animation is not so perfect when dataZoom window moves fast
@@ -86,7 +86,7 @@ export default function (
         switch (diffItem.cmd) {
             case '=':
                 let currentPt = oldData.getItemLayout(diffItem.idx) as number[];
-                let nextPt = newData.getItemLayout(diffItem.idx1) as number[];
+                const nextPt = newData.getItemLayout(diffItem.idx1) as number[];
                 // If previous data is NaN, use next point directly
                 if (isNaN(currentPt[0]) || isNaN(currentPt[1])) {
                     currentPt = nextPt.slice();
@@ -100,7 +100,7 @@ export default function (
                 rawIndices.push(newData.getRawIndex(diffItem.idx1));
                 break;
             case '+':
-                let idxAdd = diffItem.idx;
+                const idxAdd = diffItem.idx;
                 currPoints.push(
                     oldCoordSys.dataToPoint([
                         newData.get(newDataOldCoordInfo.dataDimsForPoint[0], idxAdd),
@@ -118,8 +118,8 @@ export default function (
                 rawIndices.push(newData.getRawIndex(idxAdd));
                 break;
             case '-':
-                let idxMinus = diffItem.idx;
-                let rawIndex = oldData.getRawIndex(idxMinus);
+                const idxMinus = diffItem.idx;
+                const rawIndex = oldData.getRawIndex(idxMinus);
                 // Data is replaced. In the case of dynamic data queue
                 // FIXME FIXME FIXME
                 if (rawIndex !== idxMinus) {
@@ -154,15 +154,15 @@ export default function (
         return rawIndices[a] - rawIndices[b];
     });
 
-    let sortedCurrPoints = [];
-    let sortedNextPoints = [];
+    const sortedCurrPoints = [];
+    const sortedNextPoints = [];
 
-    let sortedCurrStackedPoints = [];
-    let sortedNextStackedPoints = [];
+    const sortedCurrStackedPoints = [];
+    const sortedNextStackedPoints = [];
 
-    let sortedStatus = [];
+    const sortedStatus = [];
     for (let i = 0; i < sortedIndices.length; i++) {
-        let idx = sortedIndices[i];
+        const idx = sortedIndices[i];
         sortedCurrPoints[i] = currPoints[idx];
         sortedNextPoints[i] = nextPoints[idx];
 
diff --git a/src/chart/line/poly.ts b/src/chart/line/poly.ts
index 1a6ba3f..adb61eb 100644
--- a/src/chart/line/poly.ts
+++ b/src/chart/line/poly.ts
@@ -122,7 +122,7 @@ function drawMono(
     let idx = start;
     let k = 0;
     for (; k < segLen; k++) {
-        let p = points[idx];
+        const p = points[idx];
         if (idx >= allLen || idx < 0) {
             break;
         }
@@ -139,11 +139,11 @@ function drawMono(
         }
         else {
             if (smooth > 0) {
-                let prevP = points[prevIdx];
-                let dim = smoothMonotone === 'y' ? 1 : 0;
+                const prevP = points[prevIdx];
+                const dim = smoothMonotone === 'y' ? 1 : 0;
 
                 // Length of control point to p, either in x or y, but not both
-                let ctrlLen = (p[dim] - prevP[dim]) * smooth;
+                const ctrlLen = (p[dim] - prevP[dim]) * smooth;
 
                 v2Copy(cp0, prevP);
                 cp0[dim] = prevP[dim] + ctrlLen;
@@ -191,7 +191,7 @@ function drawNonMono(
     let idx = start;
     let k = 0;
     for (; k < segLen; k++) {
-        let p = points[idx];
+        const p = points[idx];
         if (idx >= allLen || idx < 0) {
             break;
         }
@@ -220,7 +220,7 @@ function drawNonMono(
                 }
 
                 let ratioNextSeg = 0.5;
-                let prevP = points[prevIdx];
+                const prevP = points[prevIdx];
                 nextP = points[nextIdx];
                 // Last point
                 if (!nextP || isPointNull(nextP)) {
@@ -237,7 +237,7 @@ function drawNonMono(
                     let lenPrevSeg;
                     let lenNextSeg;
                     if (smoothMonotone === 'x' || smoothMonotone === 'y') {
-                        let dim = smoothMonotone === 'x' ? 0 : 1;
+                        const dim = smoothMonotone === 'x' ? 0 : 1;
                         lenPrevSeg = Math.abs(p[dim] - prevP[dim]);
                         lenNextSeg = Math.abs(p[dim] - nextP[dim]);
                     }
@@ -278,11 +278,11 @@ function drawNonMono(
 }
 
 function getBoundingBox(points: number[][], smoothConstraint?: boolean) {
-    let ptMin = [Infinity, Infinity];
-    let ptMax = [-Infinity, -Infinity];
+    const ptMin = [Infinity, Infinity];
+    const ptMax = [-Infinity, -Infinity];
     if (smoothConstraint) {
         for (let i = 0; i < points.length; i++) {
-            let pt = points[i];
+            const pt = points[i];
             if (pt[0] < ptMin[0]) {
                 ptMin[0] = pt[0];
             }
@@ -337,12 +337,12 @@ export class ECPolyline extends Path<ECPolylineProps> {
     }
 
     buildPath(ctx: CanvasRenderingContext2D, shape: ECPolylineShape) {
-        let points = shape.points;
+        const points = shape.points;
 
         let i = 0;
         let len = points.length;
 
-        let result = getBoundingBox(points, shape.smoothConstraint);
+        const result = getBoundingBox(points, shape.smoothConstraint);
 
         if (shape.connectNulls) {
             // Must remove first and last null values avoid draw error in polygon
@@ -390,14 +390,14 @@ export class ECPolygon extends Path {
     }
 
     buildPath(ctx: CanvasRenderingContext2D, shape: ECPolygonShape) {
-        let points = shape.points;
-        let stackedOnPoints = shape.stackedOnPoints;
+        const points = shape.points;
+        const stackedOnPoints = shape.stackedOnPoints;
 
         let i = 0;
         let len = points.length;
-        let smoothMonotone = shape.smoothMonotone;
-        let bbox = getBoundingBox(points, shape.smoothConstraint);
-        let stackedOnBBox = getBoundingBox(stackedOnPoints, shape.smoothConstraint);
+        const smoothMonotone = shape.smoothMonotone;
+        const bbox = getBoundingBox(points, shape.smoothConstraint);
+        const stackedOnBBox = getBoundingBox(stackedOnPoints, shape.smoothConstraint);
 
         if (shape.connectNulls) {
             // Must remove first and last null values avoid draw error in polygon
@@ -413,7 +413,7 @@ export class ECPolygon extends Path {
             }
         }
         while (i < len) {
-            let k = drawSegment(
+            const k = drawSegment(
                 ctx, points, i, len, len,
                 1, bbox.min, bbox.max, shape.smooth,
                 smoothMonotone, shape.connectNulls
diff --git a/src/chart/lines/LinesSeries.ts b/src/chart/lines/LinesSeries.ts
index 785aeb9..7618169 100644
--- a/src/chart/lines/LinesSeries.ts
+++ b/src/chart/lines/LinesSeries.ts
@@ -43,17 +43,17 @@ const Uint32Arr = typeof Uint32Array === 'undefined' ? Array : Uint32Array;
 const Float64Arr = typeof Float64Array === 'undefined' ? Array : Float64Array;
 
 function compatEc2(seriesOpt: LinesSeriesOption) {
-    let data = seriesOpt.data;
+    const data = seriesOpt.data;
     if (data && data[0] && (data as LegacyDataItemOption[][])[0][0] && (data as LegacyDataItemOption[][])[0][0].coord) {
         if (__DEV__) {
             console.warn('Lines data configuration has been changed to'
                 + ' { coords:[[1,2],[2,3]] }');
         }
         seriesOpt.data = map(data as LegacyDataItemOption[][], function (itemOpt) {
-            let coords = [
+            const coords = [
                 itemOpt[0].coord, itemOpt[1].coord
             ];
-            let target: LinesDataItemOption = {
+            const target: LinesDataItemOption = {
                 coords: coords
             };
             if (itemOpt[0].name) {
@@ -161,7 +161,7 @@ class LinesSeriesModel extends SeriesModel<LinesSeriesOption> {
         // Not using preprocessor because mergeOption may not have series.type
         compatEc2(option);
 
-        let result = this._processFlatCoordsArray(option.data);
+        const result = this._processFlatCoordsArray(option.data);
         this._flatCoords = result.flatCoords;
         this._flatCoordsOffset = result.flatCoordsOffset;
         if (result.flatCoords) {
@@ -179,7 +179,7 @@ class LinesSeriesModel extends SeriesModel<LinesSeriesOption> {
 
         if (option.data) {
             // Only update when have option data to merge.
-            let result = this._processFlatCoordsArray(option.data);
+            const result = this._processFlatCoordsArray(option.data);
             this._flatCoords = result.flatCoords;
             this._flatCoordsOffset = result.flatCoordsOffset;
             if (result.flatCoords) {
@@ -191,7 +191,7 @@ class LinesSeriesModel extends SeriesModel<LinesSeriesOption> {
     }
 
     appendData(params: Pick<LinesSeriesOption, 'data'>) {
-        let result = this._processFlatCoordsArray(params.data);
+        const result = this._processFlatCoordsArray(params.data);
         if (result.flatCoords) {
             if (!this._flatCoords) {
                 this._flatCoords = result.flatCoords;
@@ -208,8 +208,8 @@ class LinesSeriesModel extends SeriesModel<LinesSeriesOption> {
     }
 
     _getCoordsFromItemModel(idx: number) {
-        let itemModel = this.getData().getItemModel<LinesDataItemOption>(idx);
-        let coords = (itemModel.option instanceof Array)
+        const itemModel = this.getData().getItemModel<LinesDataItemOption>(idx);
+        const coords = (itemModel.option instanceof Array)
             ? itemModel.option : itemModel.getShallow('coords');
 
         if (__DEV__) {
@@ -233,8 +233,8 @@ class LinesSeriesModel extends SeriesModel<LinesSeriesOption> {
 
     getLineCoords(idx: number, out: number[][]) {
         if (this._flatCoordsOffset) {
-            let offset = this._flatCoordsOffset[idx * 2];
-            let len = this._flatCoordsOffset[idx * 2 + 1];
+            const offset = this._flatCoordsOffset[idx * 2];
+            const len = this._flatCoordsOffset[idx * 2 + 1];
             for (let i = 0; i < len; i++) {
                 out[i] = out[i] || [];
                 out[i][0] = this._flatCoords[offset + i * 2];
@@ -243,7 +243,7 @@ class LinesSeriesModel extends SeriesModel<LinesSeriesOption> {
             return len;
         }
         else {
-            let coords = this._getCoordsFromItemModel(idx);
+            const coords = this._getCoordsFromItemModel(idx);
             for (let i = 0; i < coords.length; i++) {
                 out[i] = out[i] || [];
                 out[i][0] = coords[i][0];
@@ -261,23 +261,23 @@ class LinesSeriesModel extends SeriesModel<LinesSeriesOption> {
         // Stored as a typed array. In format
         // Points Count(2) | x | y | x | y | Points Count(3) | x |  y | x | y | x | y |
         if (typeof data[0] === 'number') {
-            let len = data.length;
+            const len = data.length;
             // Store offset and len of each segment
-            let coordsOffsetAndLenStorage = new Uint32Arr(len) as Uint32Array;
-            let coordsStorage = new Float64Arr(len) as Float64Array;
+            const coordsOffsetAndLenStorage = new Uint32Arr(len) as Uint32Array;
+            const coordsStorage = new Float64Arr(len) as Float64Array;
             let coordsCursor = 0;
             let offsetCursor = 0;
             let dataCount = 0;
             for (let i = 0; i < len;) {
                 dataCount++;
-                let count = data[i++] as number;
+                const count = data[i++] as number;
                 // Offset
                 coordsOffsetAndLenStorage[offsetCursor++] = coordsCursor + startOffset;
                 // Len
                 coordsOffsetAndLenStorage[offsetCursor++] = count;
                 for (let k = 0; k < count; k++) {
-                    let x = data[i++] as number;
-                    let y = data[i++] as number;
+                    const x = data[i++] as number;
+                    const y = data[i++] as number;
                     coordsStorage[coordsCursor++] = x;
                     coordsStorage[coordsCursor++] = y;
 
@@ -305,13 +305,13 @@ class LinesSeriesModel extends SeriesModel<LinesSeriesOption> {
 
     getInitialData(option: LinesSeriesOption, ecModel: GlobalModel) {
         if (__DEV__) {
-            let CoordSys = CoordinateSystem.get(option.coordinateSystem);
+            const CoordSys = CoordinateSystem.get(option.coordinateSystem);
             if (!CoordSys) {
                 throw new Error('Unkown coordinate system ' + option.coordinateSystem);
             }
         }
 
-        let lineData = new List(['value'], this);
+        const lineData = new List(['value'], this);
         lineData.hasItemOption = false;
 
         lineData.initData(option.data, [], function (dataItem, dimName, dataIndex, dimIndex) {
@@ -321,7 +321,7 @@ class LinesSeriesModel extends SeriesModel<LinesSeriesOption> {
             }
             else {
                 lineData.hasItemOption = true;
-                let value = dataItem.value;
+                const value = dataItem.value;
                 if (value != null) {
                     return value instanceof Array ? value[dimIndex] : value;
                 }
@@ -332,15 +332,15 @@ class LinesSeriesModel extends SeriesModel<LinesSeriesOption> {
     }
 
     formatTooltip(dataIndex: number) {
-        let data = this.getData();
-        let itemModel = data.getItemModel<LinesDataItemOption>(dataIndex);
-        let name = itemModel.get('name');
+        const data = this.getData();
+        const itemModel = data.getItemModel<LinesDataItemOption>(dataIndex);
+        const name = itemModel.get('name');
         if (name) {
             return name;
         }
-        let fromName = itemModel.get('fromName');
-        let toName = itemModel.get('toName');
-        let html = [];
+        const fromName = itemModel.get('fromName');
+        const toName = itemModel.get('toName');
+        const html = [];
         fromName != null && html.push(fromName);
         toName != null && html.push(toName);
 
@@ -352,7 +352,7 @@ class LinesSeriesModel extends SeriesModel<LinesSeriesOption> {
     }
 
     getProgressive() {
-        let progressive = this.option.progressive;
+        const progressive = this.option.progressive;
         if (progressive == null) {
             return this.option.large ? 1e4 : this.get('progressive');
         }
@@ -360,7 +360,7 @@ class LinesSeriesModel extends SeriesModel<LinesSeriesOption> {
     }
 
     getProgressiveThreshold() {
-        let progressiveThreshold = this.option.progressiveThreshold;
+        const progressiveThreshold = this.option.progressiveThreshold;
         if (progressiveThreshold == null) {
             return this.option.large ? 2e4 : this.get('progressiveThreshold');
         }
diff --git a/src/chart/lines/LinesView.ts b/src/chart/lines/LinesView.ts
index 378b95d..f89254b 100644
--- a/src/chart/lines/LinesView.ts
+++ b/src/chart/lines/LinesView.ts
@@ -51,18 +51,18 @@ class LinesView extends ChartView {
     private _isLargeDraw: boolean;
 
     render(seriesModel: LinesSeriesModel, ecModel: GlobalModel, api: ExtensionAPI) {
-        let data = seriesModel.getData();
+        const data = seriesModel.getData();
 
-        let lineDraw = this._updateLineDraw(data, seriesModel);
+        const lineDraw = this._updateLineDraw(data, seriesModel);
 
-        let zlevel = seriesModel.get('zlevel');
-        let trailLength = seriesModel.get(['effect', 'trailLength']);
+        const zlevel = seriesModel.get('zlevel');
+        const trailLength = seriesModel.get(['effect', 'trailLength']);
 
-        let zr = api.getZr();
+        const zr = api.getZr();
         // Avoid the drag cause ghost shadow
         // FIXME Better way ?
         // SVG doesn't support
-        let isSvg = zr.painter.getType() === 'svg';
+        const isSvg = zr.painter.getType() === 'svg';
         if (!isSvg) {
             (zr.painter as CanvasPainter).getLayer(zlevel).clear(true);
         }
@@ -93,7 +93,7 @@ class LinesView extends ChartView {
 
         lineDraw.updateData(data as List);
 
-        let clipPath = seriesModel.get('clip', true) && createClipPath(
+        const clipPath = seriesModel.get('clip', true) && createClipPath(
             (seriesModel.coordinateSystem as Polar | Cartesian2D), false, seriesModel
         );
         if (clipPath) {
@@ -109,9 +109,9 @@ class LinesView extends ChartView {
     }
 
     incrementalPrepareRender(seriesModel: LinesSeriesModel, ecModel: GlobalModel, api: ExtensionAPI) {
-        let data = seriesModel.getData();
+        const data = seriesModel.getData();
 
-        let lineDraw = this._updateLineDraw(data, seriesModel);
+        const lineDraw = this._updateLineDraw(data, seriesModel);
 
         lineDraw.incrementalPrepareUpdate(data);
 
@@ -131,8 +131,8 @@ class LinesView extends ChartView {
     }
 
     updateTransform(seriesModel: LinesSeriesModel, ecModel: GlobalModel, api: ExtensionAPI) {
-        let data = seriesModel.getData();
-        let pipelineContext = seriesModel.pipelineContext;
+        const data = seriesModel.getData();
+        const pipelineContext = seriesModel.pipelineContext;
 
         if (!this._finished || pipelineContext.large || pipelineContext.progressiveRender) {
             // TODO Don't have to do update in large mode. Only do it when there are millions of data.
@@ -143,7 +143,7 @@ class LinesView extends ChartView {
         else {
             // TODO Use same logic with ScatterView.
             // Manually update layout
-            let res = linesLayout.reset(seriesModel, ecModel, api) as StageHandlerProgressExecutor;
+            const res = linesLayout.reset(seriesModel, ecModel, api) as StageHandlerProgressExecutor;
             if (res.progress) {
                 res.progress({
                     start: 0,
@@ -159,10 +159,10 @@ class LinesView extends ChartView {
 
     _updateLineDraw(data: List, seriesModel: LinesSeriesModel) {
         let lineDraw = this._lineDraw;
-        let hasEffect = this._showEffect(seriesModel);
-        let isPolyline = !!seriesModel.get('polyline');
-        let pipelineContext = seriesModel.pipelineContext;
-        let isLargeDraw = pipelineContext.large;
+        const hasEffect = this._showEffect(seriesModel);
+        const isPolyline = !!seriesModel.get('polyline');
+        const pipelineContext = seriesModel.pipelineContext;
+        const isLargeDraw = pipelineContext.large;
 
         if (__DEV__) {
             if (hasEffect && isLargeDraw) {
@@ -201,8 +201,8 @@ class LinesView extends ChartView {
 
     _clearLayer(api: ExtensionAPI) {
         // Not use motion when dragging or zooming
-        let zr = api.getZr();
-        let isSvg = zr.painter.getType() === 'svg';
+        const zr = api.getZr();
+        const isSvg = zr.painter.getType() === 'svg';
         if (!isSvg && this._lastZlevel != null) {
             (zr.painter as CanvasPainter).getLayer(this._lastZlevel).clear(true);
         }
diff --git a/src/chart/lines/linesLayout.ts b/src/chart/lines/linesLayout.ts
index fcba67f..4156d14 100644
--- a/src/chart/lines/linesLayout.ts
+++ b/src/chart/lines/linesLayout.ts
@@ -29,15 +29,15 @@ const linesLayout: StageHandler = {
     plan: createRenderPlanner(),
 
     reset: function (seriesModel: LinesSeriesModel) {
-        let coordSys = seriesModel.coordinateSystem;
-        let isPolyline = seriesModel.get('polyline');
-        let isLarge = seriesModel.pipelineContext.large;
+        const coordSys = seriesModel.coordinateSystem;
+        const isPolyline = seriesModel.get('polyline');
+        const isLarge = seriesModel.pipelineContext.large;
         return {
             progress(params, lineData) {
-                let lineCoords: number[][] = [];
+                const lineCoords: number[][] = [];
                 if (isLarge) {
                     let points;
-                    let segCount = params.end - params.start;
+                    const segCount = params.end - params.start;
                     if (isPolyline) {
                         let totalCoordsCount = 0;
                         for (let i = params.start; i < params.end; i++) {
@@ -52,7 +52,7 @@ const linesLayout: StageHandler = {
                     let offset = 0;
                     let pt: number[] = [];
                     for (let i = params.start; i < params.end; i++) {
-                        let len = seriesModel.getLineCoords(i, lineCoords);
+                        const len = seriesModel.getLineCoords(i, lineCoords);
                         if (isPolyline) {
                             points[offset++] = len;
                         }
@@ -67,10 +67,10 @@ const linesLayout: StageHandler = {
                 }
                 else {
                     for (let i = params.start; i < params.end; i++) {
-                        let itemModel = lineData.getItemModel<LinesDataItemOption>(i);
-                        let len = seriesModel.getLineCoords(i, lineCoords);
+                        const itemModel = lineData.getItemModel<LinesDataItemOption>(i);
+                        const len = seriesModel.getLineCoords(i, lineCoords);
 
-                        let pts = [];
+                        const pts = [];
                         if (isPolyline) {
                             for (let j = 0; j < len; j++) {
                                 pts.push(coordSys.dataToPoint(lineCoords[j]));
@@ -80,7 +80,7 @@ const linesLayout: StageHandler = {
                             pts[0] = coordSys.dataToPoint(lineCoords[0]);
                             pts[1] = coordSys.dataToPoint(lineCoords[1]);
 
-                            let curveness = itemModel.get(['lineStyle', 'curveness']);
+                            const curveness = itemModel.get(['lineStyle', 'curveness']);
                             if (+curveness) {
                                 pts[2] = [
                                     (pts[0][0] + pts[1][0]) / 2 - (pts[0][1] - pts[1][1]) * curveness,
diff --git a/src/chart/lines/linesVisual.ts b/src/chart/lines/linesVisual.ts
index 5882909..0f37f93 100644
--- a/src/chart/lines/linesVisual.ts
+++ b/src/chart/lines/linesVisual.ts
@@ -36,9 +36,9 @@ const opacityQuery = ['lineStyle', 'opacity'] as const;
 const linesVisual: StageHandler = {
     seriesType: 'lines',
     reset(seriesModel: LinesSeriesModel) {
-        let symbolType = normalize(seriesModel.get('symbol'));
-        let symbolSize = normalize(seriesModel.get('symbolSize'));
-        let data = seriesModel.getData();
+        const symbolType = normalize(seriesModel.get('symbol'));
+        const symbolSize = normalize(seriesModel.get('symbolSize'));
+        const data = seriesModel.getData();
 
         data.setVisual('fromSymbol', symbolType && symbolType[0]);
         data.setVisual('toSymbol', symbolType && symbolType[1]);
@@ -47,10 +47,10 @@ const linesVisual: StageHandler = {
         data.setVisual('opacity', seriesModel.get(opacityQuery));
 
         function dataEach(data: List<LinesSeriesModel>, idx: number): void {
-            let itemModel = data.getItemModel(idx) as Model<LinesDataItemOption>;
-            let symbolType = normalize(itemModel.getShallow('symbol', true));
-            let symbolSize = normalize(itemModel.getShallow('symbolSize', true));
-            let opacity = itemModel.get(opacityQuery);
+            const itemModel = data.getItemModel(idx) as Model<LinesDataItemOption>;
+            const symbolType = normalize(itemModel.getShallow('symbol', true));
+            const symbolSize = normalize(itemModel.getShallow('symbolSize', true));
+            const opacity = itemModel.get(opacityQuery);
 
             symbolType[0] && data.setItemVisual(idx, 'fromSymbol', symbolType[0]);
             symbolType[1] && data.setItemVisual(idx, 'toSymbol', symbolType[1]);
diff --git a/src/chart/map/MapSeries.ts b/src/chart/map/MapSeries.ts
index d461f1d..037540d 100644
--- a/src/chart/map/MapSeries.ts
+++ b/src/chart/map/MapSeries.ts
@@ -122,17 +122,17 @@ class MapSeries extends SeriesModel<MapSeriesOption> {
 
 
     getInitialData(option: MapSeriesOption): List {
-        let data = createListSimply(this, {
+        const data = createListSimply(this, {
             coordDimensions: ['value'],
             encodeDefaulter: zrUtil.curry(makeSeriesEncodeForNameBased, this)
         });
-        let valueDim = data.mapDimension('value');
-        let dataNameMap = zrUtil.createHashMap();
-        let selectTargetList = [];
-        let toAppendNames = [] as string[];
+        const valueDim = data.mapDimension('value');
+        const dataNameMap = zrUtil.createHashMap();
+        const selectTargetList = [];
+        const toAppendNames = [] as string[];
 
         for (let i = 0, len = data.count(); i < len; i++) {
-            let name = data.getName(i);
+            const name = data.getName(i);
             dataNameMap.set(name, true);
             selectTargetList.push({
                 name: name,
@@ -141,9 +141,9 @@ class MapSeries extends SeriesModel<MapSeriesOption> {
             });
         }
 
-        let geoSource = geoSourceManager.load(this.getMapType(), this.option.nameMap);
+        const geoSource = geoSourceManager.load(this.getMapType(), this.option.nameMap);
         zrUtil.each(geoSource.regions, function (region) {
-            let name = region.name;
+            const name = region.name;
             if (!dataNameMap.get(name)) {
                 selectTargetList.push({name: name});
                 toAppendNames.push(name);
@@ -165,7 +165,7 @@ class MapSeries extends SeriesModel<MapSeriesOption> {
      * inner exclusive geo model.
      */
     getHostGeoModel(): GeoModel {
-        let geoIndex = this.option.geoIndex;
+        const geoIndex = this.option.geoIndex;
         return geoIndex != null
             ? this.dependentModels.geo[geoIndex] as GeoModel
             : null;
@@ -187,7 +187,7 @@ class MapSeries extends SeriesModel<MapSeriesOption> {
     getRawValue(dataIndex: number): ParsedValue {
         // Use value stored in data instead because it is calculated from multiple series
         // FIXME Provide all value of multiple series ?
-        let data = this.getData();
+        const data = this.getData();
         return data.get(data.mapDimension('value'), dataIndex);
     }
 
@@ -195,7 +195,7 @@ class MapSeries extends SeriesModel<MapSeriesOption> {
      * Get model of region
      */
     getRegionModel(regionName: string): Model<MapDataItemOption> {
-        let data = this.getData();
+        const data = this.getData();
         return data.getItemModel(data.indexOfName(regionName));
     }
 
@@ -204,15 +204,15 @@ class MapSeries extends SeriesModel<MapSeriesOption> {
      */
     formatTooltip(dataIndex: number): string {
         // FIXME orignalData and data is a bit confusing
-        let data = this.getData();
-        let formattedValue = addCommas(this.getRawValue(dataIndex));
-        let name = data.getName(dataIndex);
+        const data = this.getData();
+        const formattedValue = addCommas(this.getRawValue(dataIndex));
+        const name = data.getName(dataIndex);
 
-        let seriesGroup = this.seriesGroup;
-        let seriesNames = [];
+        const seriesGroup = this.seriesGroup;
+        const seriesNames = [];
         for (let i = 0; i < seriesGroup.length; i++) {
-            let otherIndex = seriesGroup[i].originalData.indexOfName(name);
-            let valueDim = data.mapDimension('value');
+            const otherIndex = seriesGroup[i].originalData.indexOfName(name);
+            const valueDim = data.mapDimension('value');
             if (!isNaN(seriesGroup[i].originalData.get(valueDim, otherIndex) as number)) {
                 seriesNames.push(
                     encodeHTML(seriesGroup[i].name)
@@ -226,9 +226,9 @@ class MapSeries extends SeriesModel<MapSeriesOption> {
 
     getTooltipPosition = function (this: MapSeries, dataIndex: number): number[] {
         if (dataIndex != null) {
-            let name = this.getData().getName(dataIndex);
-            let geo = this.coordinateSystem;
-            let region = geo.getRegion(name);
+            const name = this.getData().getName(dataIndex);
+            const geo = this.coordinateSystem;
+            const region = geo.getRegion(name);
 
             return region && geo.dataToPoint(region.center);
         }
diff --git a/src/chart/map/MapView.ts b/src/chart/map/MapView.ts
index 1326c09..87ded60 100644
--- a/src/chart/map/MapView.ts
+++ b/src/chart/map/MapView.ts
@@ -69,7 +69,7 @@ class MapView extends ChartView {
             return;
         }
 
-        let group = this.group;
+        const group = this.group;
         group.removeAll();
 
         if (mapModel.getHostGeoModel()) {
@@ -83,7 +83,7 @@ class MapView extends ChartView {
             )
         ) {
             if (mapModel.needsDrawMap) {
-                let mapDraw = this._mapDraw || new MapDraw(api, true);
+                const mapDraw = this._mapDraw || new MapDraw(api, true);
                 group.add(mapDraw.group);
 
                 mapDraw.draw(mapModel, ecModel, api, this, payload);
@@ -97,7 +97,7 @@ class MapView extends ChartView {
             }
         }
         else {
-            let mapDraw = this._mapDraw;
+            const mapDraw = this._mapDraw;
             mapDraw && group.add(mapDraw.group);
         }
 
@@ -117,25 +117,25 @@ class MapView extends ChartView {
     }
 
     private _renderSymbols(mapModel: MapSeries, ecModel: GlobalModel, api: ExtensionAPI): void {
-        let originalData = mapModel.originalData;
-        let group = this.group;
+        const originalData = mapModel.originalData;
+        const group = this.group;
 
         originalData.each(originalData.mapDimension('value'), function (value, originalDataIndex) {
             if (isNaN(value as number)) {
                 return;
             }
 
-            let layout = originalData.getItemLayout(originalDataIndex);
+            const layout = originalData.getItemLayout(originalDataIndex);
 
             if (!layout || !layout.point) {
                 // Not exists in map
                 return;
             }
 
-            let point = layout.point;
-            let offset = layout.offset;
+            const point = layout.point;
+            const offset = layout.offset;
 
-            let circle = new graphic.Circle({
+            const circle = new graphic.Circle({
                 style: {
                     // Because the special of map draw.
                     // Which needs statistic of multiple series and draw on one map.
@@ -165,16 +165,16 @@ class MapView extends ChartView {
             // settings on series `X` but render label `C` by the settings on series `Y`.
             if (!offset) {
 
-                let fullData = mapModel.mainSeries.getData();
-                let name = originalData.getName(originalDataIndex);
+                const fullData = mapModel.mainSeries.getData();
+                const name = originalData.getName(originalDataIndex);
 
-                let fullIndex = fullData.indexOfName(name);
+                const fullIndex = fullData.indexOfName(name);
 
-                let itemModel = originalData.getItemModel<MapDataItemOption>(originalDataIndex);
-                let labelModel = itemModel.getModel('label');
-                let hoverLabelModel = itemModel.getModel(['emphasis', 'label']);
+                const itemModel = originalData.getItemModel<MapDataItemOption>(originalDataIndex);
+                const labelModel = itemModel.getModel('label');
+                const hoverLabelModel = itemModel.getModel(['emphasis', 'label']);
 
-                let regionGroup = fullData.getItemGraphicEl(fullIndex) as RegionGroupExtend;
+                const regionGroup = fullData.getItemGraphicEl(fullIndex) as RegionGroupExtend;
 
                 // `getFormattedLabel` needs to use `getData` inside. Here
                 // `mapModel.getData()` is shallow cloned from `mainSeries.getData()`.
@@ -183,17 +183,17 @@ class MapView extends ChartView {
                 // set on original data item will never get. But it has been working
                 // like that from the begining, and this scenario is rarely encountered.
                 // So it won't be fixed until have to.
-                let normalText = zrUtil.retrieve2(
+                const normalText = zrUtil.retrieve2(
                     mapModel.getFormattedLabel(fullIndex, 'normal'),
                     name
                 );
-                let emphasisText = zrUtil.retrieve2(
+                const emphasisText = zrUtil.retrieve2(
                     mapModel.getFormattedLabel(fullIndex, 'emphasis'),
                     normalText
                 );
 
                 let highDownRecord = regionGroup[HIGH_DOWN_PROP];
-                let recordVersion = Math.random();
+                const recordVersion = Math.random();
 
                 // Prevent from register listeners duplicatedly when roaming.
                 if (!highDownRecord) {
diff --git a/src/chart/map/backwardCompat.ts b/src/chart/map/backwardCompat.ts
index e31a192..cd5026c 100644
--- a/src/chart/map/backwardCompat.ts
+++ b/src/chart/map/backwardCompat.ts
@@ -22,7 +22,7 @@ import { ECUnitOption, SeriesOption } from '../../util/types';
 
 export default function (option: ECUnitOption) {
     // Save geoCoord
-    let mapSeries = [];
+    const mapSeries = [];
     zrUtil.each(option.series, function (seriesOpt: SeriesOption) {
         if (seriesOpt && seriesOpt.type === 'map') {
             mapSeries.push(seriesOpt);
diff --git a/src/chart/map/mapDataStatistic.ts b/src/chart/map/mapDataStatistic.ts
index fb70a38..d986094 100644
--- a/src/chart/map/mapDataStatistic.ts
+++ b/src/chart/map/mapDataStatistic.ts
@@ -25,12 +25,12 @@ import GlobalModel from '../../model/Global';
 
 // FIXME 公用?
 function dataStatistics(datas: List[], statisticType: MapValueCalculationType): List {
-    let dataNameMap = {} as {[mapKey: string]: number[]};
+    const dataNameMap = {} as {[mapKey: string]: number[]};
 
     zrUtil.each(datas, function (data) {
         data.each(data.mapDimension('value'), function (value: number, idx) {
             // Add prefix to avoid conflict with Object.prototype.
-            let mapKey = 'ec-' + data.getName(idx);
+            const mapKey = 'ec-' + data.getName(idx);
             dataNameMap[mapKey] = dataNameMap[mapKey] || [];
             if (!isNaN(value)) {
                 dataNameMap[mapKey].push(value);
@@ -39,11 +39,11 @@ function dataStatistics(datas: List[], statisticType: MapValueCalculationType):
     });
 
     return datas[0].map(datas[0].mapDimension('value'), function (value, idx) {
-        let mapKey = 'ec-' + datas[0].getName(idx);
+        const mapKey = 'ec-' + datas[0].getName(idx);
         let sum = 0;
         let min = Infinity;
         let max = -Infinity;
-        let len = dataNameMap[mapKey].length;
+        const len = dataNameMap[mapKey].length;
         for (let i = 0; i < len; i++) {
             min = Math.min(min, dataNameMap[mapKey][i]);
             max = Math.max(max, dataNameMap[mapKey][i]);
@@ -67,15 +67,15 @@ function dataStatistics(datas: List[], statisticType: MapValueCalculationType):
 }
 
 export default function (ecModel: GlobalModel): void {
-    let seriesGroups = {} as {[key: string]: MapSeries[]};
+    const seriesGroups = {} as {[key: string]: MapSeries[]};
     ecModel.eachSeriesByType('map', function (seriesModel: MapSeries) {
-        let hostGeoModel = seriesModel.getHostGeoModel();
-        let key = hostGeoModel ? 'o' + hostGeoModel.id : 'i' + seriesModel.getMapType();
+        const hostGeoModel = seriesModel.getHostGeoModel();
+        const key = hostGeoModel ? 'o' + hostGeoModel.id : 'i' + seriesModel.getMapType();
         (seriesGroups[key] = seriesGroups[key] || []).push(seriesModel);
     });
 
     zrUtil.each(seriesGroups, function (seriesList, key) {
-        let data = dataStatistics(
+        const data = dataStatistics(
             zrUtil.map(seriesList, function (seriesModel) {
                 return seriesModel.getData();
             }),
diff --git a/src/chart/map/mapSymbolLayout.ts b/src/chart/map/mapSymbolLayout.ts
index 56f3003..671c9fb 100644
--- a/src/chart/map/mapSymbolLayout.ts
+++ b/src/chart/map/mapSymbolLayout.ts
@@ -25,23 +25,23 @@ import { Dictionary } from '../../util/types';
 
 export default function (ecModel: GlobalModel) {
 
-    let processedMapType = {} as {[mapType: string]: boolean};
+    const processedMapType = {} as {[mapType: string]: boolean};
 
     ecModel.eachSeriesByType('map', function (mapSeries: MapSeries) {
-        let mapType = mapSeries.getMapType();
+        const mapType = mapSeries.getMapType();
         if (mapSeries.getHostGeoModel() || processedMapType[mapType]) {
             return;
         }
 
-        let mapSymbolOffsets = {} as Dictionary<number>;
+        const mapSymbolOffsets = {} as Dictionary<number>;
 
         zrUtil.each(mapSeries.seriesGroup, function (subMapSeries) {
-            let geo = subMapSeries.coordinateSystem;
-            let data = subMapSeries.originalData;
+            const geo = subMapSeries.coordinateSystem;
+            const data = subMapSeries.originalData;
             if (subMapSeries.get('showLegendSymbol') && ecModel.getComponent('legend')) {
                 data.each(data.mapDimension('value'), function (value, idx) {
-                    let name = data.getName(idx);
-                    let region = geo.getRegion(name);
+                    const name = data.getName(idx);
+                    const region = geo.getRegion(name);
 
                     // If input series.data is [11, 22, '-'/null/undefined, 44],
                     // it will be filled with NaN: [11, 22, NaN, 44] and NaN will
@@ -50,9 +50,9 @@ export default function (ecModel: GlobalModel) {
                         return;
                     }
 
-                    let offset = mapSymbolOffsets[name] || 0;
+                    const offset = mapSymbolOffsets[name] || 0;
 
-                    let point = geo.dataToPoint(region.center);
+                    const point = geo.dataToPoint(region.center);
 
                     mapSymbolOffsets[name] = offset + 1;
 
@@ -65,10 +65,10 @@ export default function (ecModel: GlobalModel) {
         });
 
         // Show label of those region not has legendSymbol(which is offset 0)
-        let data = mapSeries.getData();
+        const data = mapSeries.getData();
         data.each(function (idx) {
-            let name = data.getName(idx);
-            let layout = data.getItemLayout(idx) || {};
+            const name = data.getName(idx);
+            const layout = data.getItemLayout(idx) || {};
             layout.showLabel = !mapSymbolOffsets[name];
             data.setItemLayout(idx, layout);
         });
diff --git a/src/chart/map/mapVisual.ts b/src/chart/map/mapVisual.ts
index 461a3c7..031d40c 100644
--- a/src/chart/map/mapVisual.ts
+++ b/src/chart/map/mapVisual.ts
@@ -24,11 +24,11 @@ import { ZRColor } from '../../util/types';
 
 export default function (ecModel: GlobalModel) {
     ecModel.eachSeriesByType('map', function (seriesModel: MapSeries) {
-        let colorList = seriesModel.get('color') as ZRColor[];
-        let itemStyleModel = seriesModel.getModel('itemStyle');
+        const colorList = seriesModel.get('color') as ZRColor[];
+        const itemStyleModel = seriesModel.getModel('itemStyle');
 
-        let areaColor = itemStyleModel.get('areaColor');
-        let color = itemStyleModel.get('color')
+        const areaColor = itemStyleModel.get('areaColor');
+        const color = itemStyleModel.get('color')
             || colorList[seriesModel.seriesIndex % colorList.length];
 
         seriesModel.getData().setVisual({
diff --git a/src/chart/parallel/ParallelSeries.ts b/src/chart/parallel/ParallelSeries.ts
index 3254757..879d22f 100644
--- a/src/chart/parallel/ParallelSeries.ts
+++ b/src/chart/parallel/ParallelSeries.ts
@@ -91,7 +91,7 @@ class ParallelSeriesModel extends SeriesModel<ParallelSeriesOption> {
 
 
     getInitialData(option: ParallelSeriesOption, ecModel: GlobalModel): List {
-        let source = this.getSource();
+        const source = this.getSource();
 
         setEncodeAndDimensions(source, this);
 
@@ -104,9 +104,9 @@ class ParallelSeriesModel extends SeriesModel<ParallelSeriesOption> {
      * @return Raw indices
      */
     getRawIndicesByActiveState(activeState: ParallelActiveState): number[] {
-        let coordSys = this.coordinateSystem;
-        let data = this.getData();
-        let indices = [] as number[];
+        const coordSys = this.coordinateSystem;
+        const data = this.getData();
+        const indices = [] as number[];
 
         coordSys.eachActiveState(data, function (theActiveState, dataIndex) {
             if (activeState === theActiveState) {
@@ -164,16 +164,16 @@ function setEncodeAndDimensions(source: Source, seriesModel: ParallelSeriesModel
         return;
     }
 
-    let parallelModel = seriesModel.ecModel.getComponent(
+    const parallelModel = seriesModel.ecModel.getComponent(
         'parallel', seriesModel.get('parallelIndex')
     ) as ParallelModel;
     if (!parallelModel) {
         return;
     }
 
-    let encodeDefine = source.encodeDefine = createHashMap();
+    const encodeDefine = source.encodeDefine = createHashMap();
     each(parallelModel.dimensions, function (axisDim) {
-        let dataDimIndex = convertDimNameToNumber(axisDim);
+        const dataDimIndex = convertDimNameToNumber(axisDim);
         encodeDefine.set(axisDim, dataDimIndex);
     });
 }
diff --git a/src/chart/parallel/ParallelView.ts b/src/chart/parallel/ParallelView.ts
index e995669..d5e2873 100644
--- a/src/chart/parallel/ParallelView.ts
+++ b/src/chart/parallel/ParallelView.ts
@@ -59,12 +59,12 @@ class ParallelView extends ChartView {
             animation?: boolean
         }
     ) {
-        let dataGroup = this._dataGroup;
-        let data = seriesModel.getData();
-        let oldData = this._data;
-        let coordSys = seriesModel.coordinateSystem;
-        let dimensions = coordSys.dimensions;
-        let seriesScope = makeSeriesScope(seriesModel);
+        const dataGroup = this._dataGroup;
+        const data = seriesModel.getData();
+        const oldData = this._data;
+        const coordSys = seriesModel.coordinateSystem;
+        const dimensions = coordSys.dimensions;
+        const seriesScope = makeSeriesScope(seriesModel);
 
         data.diff(oldData)
             .add(add)
@@ -73,29 +73,29 @@ class ParallelView extends ChartView {
             .execute();
 
         function add(newDataIndex: number) {
-            let line = addEl(data, dataGroup, newDataIndex, dimensions, coordSys);
+            const line = addEl(data, dataGroup, newDataIndex, dimensions, coordSys);
             updateElCommon(line, data, newDataIndex, seriesScope);
         }
 
         function update(newDataIndex: number, oldDataIndex: number) {
-            let line = oldData.getItemGraphicEl(oldDataIndex) as graphic.Polyline;
-            let points = createLinePoints(data, newDataIndex, dimensions, coordSys);
+            const line = oldData.getItemGraphicEl(oldDataIndex) as graphic.Polyline;
+            const points = createLinePoints(data, newDataIndex, dimensions, coordSys);
             data.setItemGraphicEl(newDataIndex, line);
-            let animationModel = (payload && payload.animation === false) ? null : seriesModel;
+            const animationModel = (payload && payload.animation === false) ? null : seriesModel;
             graphic.updateProps(line, {shape: {points: points}}, animationModel, newDataIndex);
 
             updateElCommon(line, data, newDataIndex, seriesScope);
         }
 
         function remove(oldDataIndex: number) {
-            let line = oldData.getItemGraphicEl(oldDataIndex);
+            const line = oldData.getItemGraphicEl(oldDataIndex);
             dataGroup.remove(line);
         }
 
         // First create
         if (!this._initialized) {
             this._initialized = true;
-            let clipPath = createGridClipShape(
+            const clipPath = createGridClipShape(
                 coordSys, seriesModel, function () {
                     // Callback will be invoked immediately if there is no animation
                     setTimeout(function () {
@@ -116,13 +116,13 @@ class ParallelView extends ChartView {
     }
 
     incrementalRender(taskParams: StageHandlerProgressParams, seriesModel: ParallelSeriesModel, ecModel: GlobalModel) {
-        let data = seriesModel.getData();
-        let coordSys = seriesModel.coordinateSystem;
-        let dimensions = coordSys.dimensions;
-        let seriesScope = makeSeriesScope(seriesModel);
+        const data = seriesModel.getData();
+        const coordSys = seriesModel.coordinateSystem;
+        const dimensions = coordSys.dimensions;
+        const seriesScope = makeSeriesScope(seriesModel);
 
         for (let dataIndex = taskParams.start; dataIndex < taskParams.end; dataIndex++) {
-            let line = addEl(data, this._dataGroup, dataIndex, dimensions, coordSys);
+            const line = addEl(data, this._dataGroup, dataIndex, dimensions, coordSys);
             line.incremental = true;
             updateElCommon(line, data, dataIndex, seriesScope);
         }
@@ -138,9 +138,9 @@ class ParallelView extends ChartView {
 }
 
 function createGridClipShape(coordSys: Parallel, seriesModel: ParallelSeriesModel, cb: () => void) {
-    let parallelModel = coordSys.model;
-    let rect = coordSys.getRect();
-    let rectEl = new graphic.Rect({
+    const parallelModel = coordSys.model;
+    const rect = coordSys.getRect();
+    const rectEl = new graphic.Rect({
         shape: {
             x: rect.x,
             y: rect.y,
@@ -149,7 +149,7 @@ function createGridClipShape(coordSys: Parallel, seriesModel: ParallelSeriesMode
         }
     });
 
-    let dim = parallelModel.get('layout') === 'horizontal' ? 'width' as const : 'height' as const;
+    const dim = parallelModel.get('layout') === 'horizontal' ? 'width' as const : 'height' as const;
     rectEl.setShape(dim, 0);
     graphic.initProps(rectEl, {
         shape: {
@@ -161,10 +161,10 @@ function createGridClipShape(coordSys: Parallel, seriesModel: ParallelSeriesMode
 }
 
 function createLinePoints(data: List, dataIndex: number, dimensions: string[], coordSys: Parallel) {
-    let points = [];
+    const points = [];
     for (let i = 0; i < dimensions.length; i++) {
-        let dimName = dimensions[i];
-        let value = data.get(data.mapDimension(dimName), dataIndex);
+        const dimName = dimensions[i];
+        const value = data.get(data.mapDimension(dimName), dataIndex);
         if (!isEmptyValue(value, coordSys.getAxis(dimName).type)) {
             points.push(coordSys.dataToPoint(value, dimName));
         }
@@ -173,8 +173,8 @@ function createLinePoints(data: List, dataIndex: number, dimensions: string[], c
 }
 
 function addEl(data: List, dataGroup: graphic.Group, dataIndex: number, dimensions: string[], coordSys: Parallel) {
-    let points = createLinePoints(data, dataIndex, dimensions, coordSys);
-    let line = new graphic.Polyline({
+    const points = createLinePoints(data, dataIndex, dimensions, coordSys);
+    const line = new graphic.Polyline({
         shape: {points: points},
         silent: true,
         z2: 10
@@ -203,14 +203,14 @@ function updateElCommon(
     let lineStyle = seriesScope.lineStyle;
 
     if (data.hasItemOption) {
-        let lineStyleModel = data.getItemModel<ParallelSeriesDataItemOption>(dataIndex)
+        const lineStyleModel = data.getItemModel<ParallelSeriesDataItemOption>(dataIndex)
             .getModel('lineStyle');
         lineStyle = lineStyleModel.getLineStyle();
     }
 
     el.useStyle(lineStyle);
 
-    let elStyle = el.style;
+    const elStyle = el.style;
     elStyle.fill = null;
     // lineStyle.color have been set to itemVisual in module:echarts/visual/seriesColor.
     elStyle.stroke = data.getItemVisual(dataIndex, 'color');
diff --git a/src/chart/parallel/parallelVisual.ts b/src/chart/parallel/parallelVisual.ts
index 4b20b39..4aa88a6 100644
--- a/src/chart/parallel/parallelVisual.ts
+++ b/src/chart/parallel/parallelVisual.ts
@@ -31,20 +31,20 @@ const parallelVisual: StageHandler = {
     reset: function (seriesModel: ParallelSeriesModel, ecModel) {
 
         // let itemStyleModel = seriesModel.getModel('itemStyle');
-        let lineStyleModel = seriesModel.getModel('lineStyle');
-        let globalColors = ecModel.get('color');
+        const lineStyleModel = seriesModel.getModel('lineStyle');
+        const globalColors = ecModel.get('color');
 
-        let color = lineStyleModel.get('color')
+        const color = lineStyleModel.get('color')
             // || itemStyleModel.get('color')
             || globalColors[seriesModel.seriesIndex % globalColors.length];
-        let inactiveOpacity = seriesModel.get('inactiveOpacity');
-        let activeOpacity = seriesModel.get('activeOpacity');
-        let lineStyle = seriesModel.getModel('lineStyle').getLineStyle();
+        const inactiveOpacity = seriesModel.get('inactiveOpacity');
+        const activeOpacity = seriesModel.get('activeOpacity');
+        const lineStyle = seriesModel.getModel('lineStyle').getLineStyle();
 
-        let coordSys = seriesModel.coordinateSystem;
-        let data = seriesModel.getData();
+        const coordSys = seriesModel.coordinateSystem;
+        const data = seriesModel.getData();
 
-        let opacityMap = {
+        const opacityMap = {
             normal: lineStyle.opacity,
             active: activeOpacity,
             inactive: inactiveOpacity
@@ -57,7 +57,7 @@ const parallelVisual: StageHandler = {
                 coordSys.eachActiveState(data, function (activeState, dataIndex) {
                     let opacity = opacityMap[activeState];
                     if (activeState === 'normal' && data.hasItemOption) {
-                        let itemOpacity = data.getItemModel<ParallelSeriesOption>(dataIndex).get(
+                        const itemOpacity = data.getItemModel<ParallelSeriesOption>(dataIndex).get(
                             opacityAccessPath, true
                         );
                         itemOpacity != null && (opacity = itemOpacity);
diff --git a/src/chart/pie/PieSeries.ts b/src/chart/pie/PieSeries.ts
index 8c08c5b..bae1cdd 100644
--- a/src/chart/pie/PieSeries.ts
+++ b/src/chart/pie/PieSeries.ts
@@ -149,9 +149,9 @@ class PieSeriesModel extends SeriesModel<PieSeriesOption> {
     }
 
     private _createSelectableList(): SelectableTarget[] {
-        let data = this.getRawData();
-        let valueDim = data.mapDimension('value');
-        let targetList = [];
+        const data = this.getRawData();
+        const valueDim = data.mapDimension('value');
+        const targetList = [];
         for (let i = 0, len = data.count(); i < len; i++) {
             targetList.push({
                 name: data.getName(i),
@@ -166,11 +166,11 @@ class PieSeriesModel extends SeriesModel<PieSeriesOption> {
      * @overwrite
      */
     getDataParams(dataIndex: number): CallbackDataParams {
-        let data = this.getData();
-        let params = super.getDataParams(dataIndex);
+        const data = this.getData();
+        const params = super.getDataParams(dataIndex);
         // FIXME toFixed?
 
-        let valueList: number[] = [];
+        const valueList: number[] = [];
         data.each(data.mapDimension('value'), function (value: number) {
             valueList.push(value);
         });
@@ -189,8 +189,8 @@ class PieSeriesModel extends SeriesModel<PieSeriesOption> {
         // Extend labelLine emphasis
         modelUtil.defaultEmphasis(option, 'labelLine', ['show']);
 
-        let labelLineNormalOpt = option.labelLine;
-        let labelLineEmphasisOpt = option.emphasis.labelLine;
+        const labelLineNormalOpt = option.labelLine;
+        const labelLineEmphasisOpt = option.emphasis.labelLine;
         // Not show label line if `label.normal.show = false`
         labelLineNormalOpt.show = labelLineNormalOpt.show
             && option.label.show;
diff --git a/src/chart/pie/PieView.ts b/src/chart/pie/PieView.ts
index e9217e1..386d07d 100644
--- a/src/chart/pie/PieView.ts
+++ b/src/chart/pie/PieView.ts
@@ -37,10 +37,10 @@ function updateDataSelected(
     hasAnimation: boolean,
     api: ExtensionAPI
 ): void {
-    let data = seriesModel.getData();
-    let dataIndex = graphic.getECData(this).dataIndex;
-    let name = data.getName(dataIndex);
-    let selectedOffset = seriesModel.get('selectedOffset');
+    const data = seriesModel.getData();
+    const dataIndex = graphic.getECData(this).dataIndex;
+    const name = data.getName(dataIndex);
+    const selectedOffset = seriesModel.get('selectedOffset');
 
     api.dispatchAction({
         type: 'pieToggleSelect',
@@ -67,13 +67,13 @@ function toggleItemSelected(
     selectedOffset: number,
     hasAnimation: boolean
 ): void {
-    let midAngle = (layout.startAngle + layout.endAngle) / 2;
+    const midAngle = (layout.startAngle + layout.endAngle) / 2;
 
-    let dx = Math.cos(midAngle);
-    let dy = Math.sin(midAngle);
+    const dx = Math.cos(midAngle);
+    const dy = Math.sin(midAngle);
 
-    let offset = isSelected ? selectedOffset : 0;
-    let position = [dx * offset, dy * offset];
+    const offset = isSelected ? selectedOffset : 0;
+    const position = [dx * offset, dy * offset];
 
     hasAnimation
         // animateTo will stop revious animation like update transition
@@ -93,12 +93,12 @@ class PiePiece extends graphic.Group {
     constructor(data: List, idx: number) {
         super();
 
-        let sector = new graphic.Sector({
+        const sector = new graphic.Sector({
             z2: 2
         });
 
-        let polyline = new graphic.Polyline();
-        let text = new graphic.Text();
+        const polyline = new graphic.Polyline();
+        const text = new graphic.Text();
         this.add(sector);
         this.add(polyline);
 
@@ -108,22 +108,22 @@ class PiePiece extends graphic.Group {
     }
 
     updateData(data: List, idx: number, firstCreate?: boolean): void {
-        let sector = this.childAt(0) as graphic.Sector;
+        const sector = this.childAt(0) as graphic.Sector;
 
-        let seriesModel = data.hostModel as PieSeriesModel;
-        let itemModel = data.getItemModel<PieDataItemOption>(idx);
-        let layout = data.getItemLayout(idx);
-        let sectorShape = zrUtil.extend({}, layout);
+        const seriesModel = data.hostModel as PieSeriesModel;
+        const itemModel = data.getItemModel<PieDataItemOption>(idx);
+        const layout = data.getItemLayout(idx);
+        const sectorShape = zrUtil.extend({}, layout);
         // Not animate label
         sectorShape.label = null;
         sectorShape.viewRect = null;
 
-        let animationTypeUpdate = seriesModel.getShallow('animationTypeUpdate');
+        const animationTypeUpdate = seriesModel.getShallow('animationTypeUpdate');
 
         if (firstCreate) {
             sector.setShape(sectorShape);
 
-            let animationType = seriesModel.getShallow('animationType');
+            const animationType = seriesModel.getShallow('animationType');
             if (animationType === 'scale') {
                 sector.shape.r = layout.r0;
                 graphic.initProps(sector, {
@@ -157,7 +157,7 @@ class PiePiece extends graphic.Group {
         }
 
         // Update common style
-        let visualColor = data.getItemVisual(idx, 'color');
+        const visualColor = data.getItemVisual(idx, 'color');
 
         sector.useStyle(
             zrUtil.defaults(
@@ -171,7 +171,7 @@ class PiePiece extends graphic.Group {
         const sectorEmphasisState = sector.ensureState('emphasis');
         sectorEmphasisState.style = itemModel.getModel(['emphasis', 'itemStyle']).getItemStyle();
 
-        let cursorStyle = itemModel.getShallow('cursor');
+        const cursorStyle = itemModel.getShallow('cursor');
         cursorStyle && sector.attr('cursor', cursorStyle);
 
         // Toggle selected
@@ -184,7 +184,7 @@ class PiePiece extends graphic.Group {
         );
 
         // Label and text animation should be applied only for transition type animation when update
-        let withAnimation = !firstCreate && animationTypeUpdate === 'transition';
+        const withAnimation = !firstCreate && animationTypeUpdate === 'transition';
         this._updateLabel(data, idx, withAnimation);
 
         (this as ECElement).highDownOnUpdate = (itemModel.get('hoverAnimation') && seriesModel.isAnimationEnabled())
@@ -234,18 +234,18 @@ class PiePiece extends graphic.Group {
             return;
         }
 
-        let targetLineShape: {
+        const targetLineShape: {
             points: number[][]
         } = {
             points: labelLayout.linePoints || [
                 [labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y]
             ]
         };
-        let labelModel = itemModel.getModel('label');
-        let labelHoverModel = itemModel.getModel(['emphasis', 'label']);
-        let labelLineModel = itemModel.getModel('labelLine');
-        let labelLineHoverModel = itemModel.getModel(['emphasis', 'labelLine']);
-        let visualColor = data.getItemVisual(idx, 'color');
+        const labelModel = itemModel.getModel('label');
+        const labelHoverModel = itemModel.getModel(['emphasis', 'label']);
+        const labelLineModel = itemModel.getModel('labelLine');
+        const labelLineHoverModel = itemModel.getModel(['emphasis', 'labelLine']);
+        const visualColor = data.getItemVisual(idx, 'color');
 
         graphic.setLabelStyle(
             labelText,
@@ -272,7 +272,7 @@ class PiePiece extends graphic.Group {
             outsideFill: visualColor
         });
 
-        let targetTextStyle = {
+        const targetTextStyle = {
             x: labelLayout.x,
             y: labelLayout.y
         };
@@ -338,7 +338,7 @@ class PieView extends ChartView {
     private _data: List;
 
     init(): void {
-        let sectorGroup = new graphic.Group();
+        const sectorGroup = new graphic.Group();
         this._sectorGroup = sectorGroup;
     }
 
@@ -347,23 +347,23 @@ class PieView extends ChartView {
             return;
         }
 
-        let data = seriesModel.getData();
-        let oldData = this._data;
-        let group = this.group;
+        const data = seriesModel.getData();
+        const oldData = this._data;
+        const group = this.group;
 
-        let hasAnimation = ecModel.get('animation');
-        let isFirstRender = !oldData;
-        let animationType = seriesModel.get('animationType');
-        let animationTypeUpdate = seriesModel.get('animationTypeUpdate');
+        const hasAnimation = ecModel.get('animation');
+        const isFirstRender = !oldData;
+        const animationType = seriesModel.get('animationType');
+        const animationTypeUpdate = seriesModel.get('animationTypeUpdate');
 
-        let onSectorClick = zrUtil.curry(
+        const onSectorClick = zrUtil.curry(
             updateDataSelected, this.uid, seriesModel, hasAnimation, api
         );
 
-        let selectedMode = seriesModel.get('selectedMode');
+        const selectedMode = seriesModel.get('selectedMode');
         data.diff(oldData)
             .add(function (idx) {
-                let piePiece = new PiePiece(data, idx);
+                const piePiece = new PiePiece(data, idx);
                 // Default expansion animation
                 if (isFirstRender && animationType !== 'scale') {
                     piePiece.eachChild(function (child) {
@@ -378,7 +378,7 @@ class PieView extends ChartView {
                 group.add(piePiece);
             })
             .update(function (newIdx, oldIdx) {
-                let piePiece = oldData.getItemGraphicEl(oldIdx) as PiePiece;
+                const piePiece = oldData.getItemGraphicEl(oldIdx) as PiePiece;
 
                 if (!isFirstRender && animationTypeUpdate !== 'transition') {
                     piePiece.eachChild(function (child) {
@@ -394,7 +394,7 @@ class PieView extends ChartView {
                 data.setItemGraphicEl(newIdx, piePiece);
             })
             .remove(function (idx) {
-                let piePiece = oldData.getItemGraphicEl(idx);
+                const piePiece = oldData.getItemGraphicEl(idx);
                 group.remove(piePiece);
             })
             .execute();
@@ -408,9 +408,9 @@ class PieView extends ChartView {
                 shape = data.getItemLayout(s);
             }
 
-            let r = Math.max(api.getWidth(), api.getHeight()) / 2;
+            const r = Math.max(api.getWidth(), api.getHeight()) / 2;
 
-            let removeClipPath = zrUtil.bind(group.removeClipPath, group);
+            const removeClipPath = zrUtil.bind(group.removeClipPath, group);
             group.setClipPath(this._createClipPath(
                 shape.cx, shape.cy, r, shape.startAngle, shape.clockwise, removeClipPath, seriesModel, isFirstRender
             ));
@@ -432,7 +432,7 @@ class PieView extends ChartView {
         cb,
         seriesModel: PieSeriesModel, isFirstRender: boolean
     ): graphic.Sector {
-        let clipPath = new graphic.Sector({
+        const clipPath = new graphic.Sector({
             shape: {
                 cx: cx,
                 cy: cy,
@@ -444,7 +444,7 @@ class PieView extends ChartView {
             }
         });
 
-        let initOrUpdate = isFirstRender ? graphic.initProps : graphic.updateProps;
+        const initOrUpdate = isFirstRender ? graphic.initProps : graphic.updateProps;
         initOrUpdate(clipPath, {
             shape: {
                 endAngle: startAngle + (clockwise ? 1 : -1) * Math.PI * 2
@@ -455,12 +455,12 @@ class PieView extends ChartView {
     }
 
     containPoint(point: number[], seriesModel: PieSeriesModel): boolean {
-        let data = seriesModel.getData();
-        let itemLayout = data.getItemLayout(0);
+        const data = seriesModel.getData();
+        const itemLayout = data.getItemLayout(0);
         if (itemLayout) {
-            let dx = point[0] - itemLayout.cx;
-            let dy = point[1] - itemLayout.cy;
-            let radius = Math.sqrt(dx * dx + dy * dy);
+            const dx = point[0] - itemLayout.cx;
+            const dy = point[1] - itemLayout.cy;
+            const radius = Math.sqrt(dx * dx + dy * dy);
             return radius <= itemLayout.r && radius >= itemLayout.r0;
         }
     }
diff --git a/src/chart/pie/labelLayout.ts b/src/chart/pie/labelLayout.ts
index e967900..04542b5 100644
--- a/src/chart/pie/labelLayout.ts
+++ b/src/chart/pie/labelLayout.ts
@@ -116,9 +116,9 @@ function adjustSingleSide(
                 continue;
             }
 
-            let deltaY = Math.abs(list[i].y - cy);
-            let length = list[i].len;
-            let length2 = list[i].len2;
+            const deltaY = Math.abs(list[i].y - cy);
+            const length = list[i].len;
+            const length2 = list[i].len2;
             let deltaX = (deltaY < r + length)
                 ? Math.sqrt(
                         (r + length + length2) * (r + length + length2)
@@ -141,12 +141,12 @@ function adjustSingleSide(
 
     let lastY = 0;
     let delta;
-    let len = list.length;
-    let upList = [];
-    let downList = [];
+    const len = list.length;
+    const upList = [];
+    const downList = [];
     for (let i = 0; i < len; i++) {
         if (list[i].position === 'outer' && list[i].labelAlignTo === 'labelLine') {
-            let dx = list[i].x - farthestX;
+            const dx = list[i].x - farthestX;
             list[i].linePoints[1][0] += dx;
             list[i].x = farthestX;
         }
@@ -182,8 +182,8 @@ function avoidOverlap(
     viewLeft: number,
     viewTop: number
 ) {
-    let leftList = [];
-    let rightList = [];
+    const leftList = [];
+    const rightList = [];
     let leftmostX = Number.MAX_VALUE;
     let rightmostX = -Number.MAX_VALUE;
     for (let i = 0; i < labelLayoutList.length; i++) {
@@ -204,14 +204,14 @@ function avoidOverlap(
     adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight, viewLeft, viewTop, leftmostX);
 
     for (let i = 0; i < labelLayoutList.length; i++) {
-        let layout = labelLayoutList[i];
+        const layout = labelLayoutList[i];
         if (isPositionCenter(layout)) {
             continue;
         }
 
-        let linePoints = layout.linePoints;
+        const linePoints = layout.linePoints;
         if (linePoints) {
-            let isAlignToEdge = layout.labelAlignTo === 'edge';
+            const isAlignToEdge = layout.labelAlignTo === 'edge';
 
             let realTextWidth = layout.textRect.width;
             let targetTextWidth;
@@ -241,7 +241,7 @@ function avoidOverlap(
                 }
             }
 
-            let dist = linePoints[1][0] - linePoints[2][0];
+            const dist = linePoints[1][0] - linePoints[2][0];
             if (isAlignToEdge) {
                 if (layout.x < cx) {
                     linePoints[2][0] = viewLeft + layout.labelMargin + realTextWidth + layout.labelDistance;
@@ -278,27 +278,27 @@ export default function (
     viewLeft: number,
     viewTop: number
 ) {
-    let data = seriesModel.getData();
-    let labelLayoutList: LabelLayout[] = [];
+    const data = seriesModel.getData();
+    const labelLayoutList: LabelLayout[] = [];
     let cx;
     let cy;
     let hasLabelRotate = false;
-    let minShowLabelRadian = (seriesModel.get('minShowLabelAngle') || 0) * RADIAN;
+    const minShowLabelRadian = (seriesModel.get('minShowLabelAngle') || 0) * RADIAN;
 
     data.each(function (idx) {
-        let layout = data.getItemLayout(idx);
+        const layout = data.getItemLayout(idx);
 
-        let itemModel = data.getItemModel<PieDataItemOption>(idx);
-        let labelModel = itemModel.getModel('label');
+        const itemModel = data.getItemModel<PieDataItemOption>(idx);
+        const labelModel = itemModel.getModel('label');
         // Use position in normal or emphasis
-        let labelPosition = labelModel.get('position') || itemModel.get(['emphasis', 'label', 'position']);
-        let labelDistance = labelModel.get('distanceToLabelLine');
-        let labelAlignTo = labelModel.get('alignTo');
-        let labelMargin = parsePercent(labelModel.get('margin'), viewWidth);
-        let bleedMargin = labelModel.get('bleedMargin');
-        let font = labelModel.getFont();
-
-        let labelLineModel = itemModel.getModel('labelLine');
+        const labelPosition = labelModel.get('position') || itemModel.get(['emphasis', 'label', 'position']);
+        const labelDistance = labelModel.get('distanceToLabelLine');
+        const labelAlignTo = labelModel.get('alignTo');
+        const labelMargin = parsePercent(labelModel.get('margin'), viewWidth);
+        const bleedMargin = labelModel.get('bleedMargin');
+        const font = labelModel.getFont();
+
+        const labelLineModel = itemModel.getModel('labelLine');
         let labelLineLen = labelLineModel.get('length');
         labelLineLen = parsePercent(labelLineLen, viewWidth);
         let labelLineLen2 = labelLineModel.get('length2');
@@ -308,9 +308,9 @@ export default function (
             return;
         }
 
-        let midAngle = (layout.startAngle + layout.endAngle) / 2;
-        let dx = Math.cos(midAngle);
-        let dy = Math.sin(midAngle);
+        const midAngle = (layout.startAngle + layout.endAngle) / 2;
+        const dx = Math.cos(midAngle);
+        const dy = Math.sin(midAngle);
 
         let textX;
         let textY;
@@ -320,29 +320,29 @@ export default function (
         cx = layout.cx;
         cy = layout.cy;
 
-        let text = seriesModel.getFormattedLabel(idx, 'normal')
+        const text = seriesModel.getFormattedLabel(idx, 'normal')
                 || data.getName(idx);
-        let textRect = textContain.getBoundingRect(text, font, textAlign, 'top');
+        const textRect = textContain.getBoundingRect(text, font, textAlign, 'top');
 
-        let isLabelInside = labelPosition === 'inside' || labelPosition === 'inner';
+        const isLabelInside = labelPosition === 'inside' || labelPosition === 'inner';
         if (labelPosition === 'center') {
             textX = layout.cx;
             textY = layout.cy;
             textAlign = 'center';
         }
         else {
-            let x1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dx : layout.r * dx) + cx;
-            let y1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dy : layout.r * dy) + cy;
+            const x1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dx : layout.r * dx) + cx;
+            const y1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dy : layout.r * dy) + cy;
 
             textX = x1 + dx * 3;
             textY = y1 + dy * 3;
 
             if (!isLabelInside) {
                 // For roseType
-                let x2 = x1 + dx * (labelLineLen + r - layout.r);
-                let y2 = y1 + dy * (labelLineLen + r - layout.r);
-                let x3 = x2 + ((dx < 0 ? -1 : 1) * labelLineLen2);
-                let y3 = y2;
+                const x2 = x1 + dx * (labelLineLen + r - layout.r);
+                const y2 = y1 + dy * (labelLineLen + r - layout.r);
+                const x3 = x2 + ((dx < 0 ? -1 : 1) * labelLineLen2);
+                const y3 = y2;
 
                 if (labelAlignTo === 'edge') {
                     // Adjust textX because text align of edge is opposite
@@ -365,7 +365,7 @@ export default function (
         }
 
         let labelRotate;
-        let rotate = labelModel.get('rotate');
+        const rotate = labelModel.get('rotate');
         if (typeof rotate === 'number') {
             labelRotate = rotate * (Math.PI / 180);
         }
diff --git a/src/chart/pie/pieLayout.ts b/src/chart/pie/pieLayout.ts
index 8ff6d29..5925c17 100644
--- a/src/chart/pie/pieLayout.ts
+++ b/src/chart/pie/pieLayout.ts
@@ -43,9 +43,9 @@ export default function (
     api: ExtensionAPI
 ) {
     ecModel.eachSeriesByType(seriesType, function (seriesModel: PieSeriesModel) {
-        let data = seriesModel.getData();
-        let valueDim = data.mapDimension('value');
-        let viewRect = getViewRect(seriesModel, api);
+        const data = seriesModel.getData();
+        const valueDim = data.mapDimension('value');
+        const viewRect = getViewRect(seriesModel, api);
 
         let center = seriesModel.get('center');
         let radius = seriesModel.get('radius');
@@ -57,34 +57,34 @@ export default function (
             center = [center, center];
         }
 
-        let width = parsePercent(viewRect.width, api.getWidth());
-        let height = parsePercent(viewRect.height, api.getHeight());
-        let size = Math.min(width, height);
-        let cx = parsePercent(center[0], width) + viewRect.x;
-        let cy = parsePercent(center[1], height) + viewRect.y;
-        let r0 = parsePercent(radius[0], size / 2);
-        let r = parsePercent(radius[1], size / 2);
+        const width = parsePercent(viewRect.width, api.getWidth());
+        const height = parsePercent(viewRect.height, api.getHeight());
+        const size = Math.min(width, height);
+        const cx = parsePercent(center[0], width) + viewRect.x;
+        const cy = parsePercent(center[1], height) + viewRect.y;
+        const r0 = parsePercent(radius[0], size / 2);
+        const r = parsePercent(radius[1], size / 2);
 
-        let startAngle = -seriesModel.get('startAngle') * RADIAN;
+        const startAngle = -seriesModel.get('startAngle') * RADIAN;
 
-        let minAngle = seriesModel.get('minAngle') * RADIAN;
+        const minAngle = seriesModel.get('minAngle') * RADIAN;
 
         let validDataCount = 0;
         data.each(valueDim, function (value: number) {
             !isNaN(value) && validDataCount++;
         });
 
-        let sum = data.getSum(valueDim);
+        const sum = data.getSum(valueDim);
         // Sum may be 0
         let unitRadian = Math.PI / (sum || validDataCount) * 2;
 
-        let clockwise = seriesModel.get('clockwise');
+        const clockwise = seriesModel.get('clockwise');
 
-        let roseType = seriesModel.get('roseType');
-        let stillShowZeroSum = seriesModel.get('stillShowZeroSum');
+        const roseType = seriesModel.get('roseType');
+        const stillShowZeroSum = seriesModel.get('stillShowZeroSum');
 
         // [0...max]
-        let extent = data.getDataExtent(valueDim);
+        const extent = data.getDataExtent(valueDim);
         extent[0] = 0;
 
         // In the case some sector angle is smaller than minAngle
@@ -92,7 +92,7 @@ export default function (
         let valueSumLargerThanMinAngle = 0;
 
         let currentAngle = startAngle;
-        let dir = clockwise ? 1 : -1;
+        const dir = clockwise ? 1 : -1;
 
         data.each(valueDim, function (value: number, idx: number) {
             let angle;
@@ -130,7 +130,7 @@ export default function (
                 valueSumLargerThanMinAngle += value;
             }
 
-            let endAngle = currentAngle + dir * angle;
+            const endAngle = currentAngle + dir * angle;
             data.setItemLayout(idx, {
                 angle: angle,
                 startAngle: currentAngle,
@@ -154,10 +154,10 @@ export default function (
             // Average the angle if rest angle is not enough after all angles is
             // Constrained by minAngle
             if (restAngle <= 1e-3) {
-                let angle = PI2 / validDataCount;
+                const angle = PI2 / validDataCount;
                 data.each(valueDim, function (value: number, idx: number) {
                     if (!isNaN(value)) {
-                        let layout = data.getItemLayout(idx);
+                        const layout = data.getItemLayout(idx);
                         layout.angle = angle;
                         layout.startAngle = startAngle + dir * idx * angle;
                         layout.endAngle = startAngle + dir * (idx + 1) * angle;
@@ -169,8 +169,8 @@ export default function (
                 currentAngle = startAngle;
                 data.each(valueDim, function (value: number, idx: number) {
                     if (!isNaN(value)) {
-                        let layout = data.getItemLayout(idx);
-                        let angle = layout.angle === minAngle
+                        const layout = data.getItemLayout(idx);
+                        const angle = layout.angle === minAngle
                             ? minAngle : value * unitRadian;
                         layout.startAngle = currentAngle;
                         layout.endAngle = currentAngle + dir * angle;
diff --git a/src/chart/radar/RadarSeries.ts b/src/chart/radar/RadarSeries.ts
index 7612999..0403b8d 100644
--- a/src/chart/radar/RadarSeries.ts
+++ b/src/chart/radar/RadarSeries.ts
@@ -102,13 +102,13 @@ class RadarSeriesModel extends SeriesModel<RadarSeriesOption> {
     }
 
     formatTooltip(dataIndex: number) {
-        let data = this.getData();
-        let coordSys = this.coordinateSystem;
-        let indicatorAxes = coordSys.getIndicatorAxes();
-        let name = this.getData().getName(dataIndex);
+        const data = this.getData();
+        const coordSys = this.coordinateSystem;
+        const indicatorAxes = coordSys.getIndicatorAxes();
+        const name = this.getData().getName(dataIndex);
         return encodeHTML(name === '' ? this.name : name) + '<br/>'
             + zrUtil.map(indicatorAxes, function (axis, idx) {
-                let val = data.get(data.mapDimension(axis.dim), dataIndex);
+                const val = data.get(data.mapDimension(axis.dim), dataIndex);
                 return encodeHTML(axis.name + ' : ' + val);
             }).join('<br />');
     }
@@ -118,9 +118,9 @@ class RadarSeriesModel extends SeriesModel<RadarSeriesOption> {
      */
     getTooltipPosition(dataIndex: number) {
         if (dataIndex != null) {
-            let data = this.getData();
-            let coordSys = this.coordinateSystem;
-            let values = data.getValues(
+            const data = this.getData();
+            const coordSys = this.coordinateSystem;
+            const values = data.getValues(
                 zrUtil.map(coordSys.dimensions, function (dim) {
                     return data.mapDimension(dim);
                 }), dataIndex
@@ -128,7 +128,7 @@ class RadarSeriesModel extends SeriesModel<RadarSeriesOption> {
 
             for (let i = 0, len = values.length; i < len; i++) {
                 if (!isNaN(values[i] as number)) {
-                    let indicatorAxes = coordSys.getIndicatorAxes();
+                    const indicatorAxes = coordSys.getIndicatorAxes();
                     return coordSys.coordToPoint(indicatorAxes[i].dataToCoord(values[i]), i);
                 }
             }
diff --git a/src/chart/radar/RadarView.ts b/src/chart/radar/RadarView.ts
index cf02d4b..804fb2a 100644
--- a/src/chart/radar/RadarView.ts
+++ b/src/chart/radar/RadarView.ts
@@ -46,22 +46,22 @@ class RadarView extends ChartView {
     private _data: List<RadarSeriesModel>;
 
     render(seriesModel: RadarSeriesModel, ecModel: GlobalModel, api: ExtensionAPI) {
-        let polar = seriesModel.coordinateSystem;
-        let group = this.group;
+        const polar = seriesModel.coordinateSystem;
+        const group = this.group;
 
-        let data = seriesModel.getData();
-        let oldData = this._data;
+        const data = seriesModel.getData();
+        const oldData = this._data;
 
         function createSymbol(data: List<RadarSeriesModel>, idx: number) {
-            let symbolType = data.getItemVisual(idx, 'symbol') as string || 'circle';
-            let color = data.getItemVisual(idx, 'color') as ZRColor;
+            const symbolType = data.getItemVisual(idx, 'symbol') as string || 'circle';
+            const color = data.getItemVisual(idx, 'color') as ZRColor;
             if (symbolType === 'none') {
                 return;
             }
-            let symbolSize = normalizeSymbolSize(
+            const symbolSize = normalizeSymbolSize(
                 data.getItemVisual(idx, 'symbolSize')
             );
-            let symbolPath = symbolUtil.createSymbol(
+            const symbolPath = symbolUtil.createSymbol(
                 symbolType, -1, -1, 2, 2, color
             );
             symbolPath.attr({
@@ -85,7 +85,7 @@ class RadarView extends ChartView {
             // Simply rerender all
             symbolGroup.removeAll();
             for (let i = 0; i < newPoints.length - 1; i++) {
-                let symbolPath = createSymbol(data, idx);
+                const symbolPath = createSymbol(data, idx);
                 if (symbolPath) {
                     symbolPath.__dimIdx = i;
                     if (oldPoints[i]) {
@@ -111,13 +111,13 @@ class RadarView extends ChartView {
         }
         data.diff(oldData)
             .add(function (idx) {
-                let points = data.getItemLayout(idx);
+                const points = data.getItemLayout(idx);
                 if (!points) {
                     return;
                 }
-                let polygon = new graphic.Polygon();
-                let polyline = new graphic.Polyline();
-                let target = {
+                const polygon = new graphic.Polygon();
+                const polyline = new graphic.Polyline();
+                const target = {
                     shape: {
                         points: points
                     }
@@ -128,8 +128,8 @@ class RadarView extends ChartView {
                 graphic.initProps(polygon, target, seriesModel, idx);
                 graphic.initProps(polyline, target, seriesModel, idx);
 
-                let itemGroup = new graphic.Group();
-                let symbolGroup = new graphic.Group();
+                const itemGroup = new graphic.Group();
+                const symbolGroup = new graphic.Group();
                 itemGroup.add(polyline);
                 itemGroup.add(polygon);
                 itemGroup.add(symbolGroup);
@@ -141,11 +141,11 @@ class RadarView extends ChartView {
                 data.setItemGraphicEl(idx, itemGroup);
             })
             .update(function (newIdx, oldIdx) {
-                let itemGroup = oldData.getItemGraphicEl(oldIdx) as graphic.Group;
-                let polyline = itemGroup.childAt(0) as graphic.Polyline;
-                let polygon = itemGroup.childAt(1) as graphic.Polygon;
-                let symbolGroup = itemGroup.childAt(2) as graphic.Group;
-                let target = {
+                const itemGroup = oldData.getItemGraphicEl(oldIdx) as graphic.Group;
+                const polyline = itemGroup.childAt(0) as graphic.Polyline;
+                const polygon = itemGroup.childAt(1) as graphic.Polygon;
+                const symbolGroup = itemGroup.childAt(2) as graphic.Group;
+                const target = {
                     shape: {
                         points: data.getItemLayout(newIdx)
                     }
@@ -174,11 +174,11 @@ class RadarView extends ChartView {
             .execute();
 
         data.eachItemGraphicEl(function (itemGroup: graphic.Group, idx) {
-            let itemModel = data.getItemModel<RadarSeriesDataItemOption>(idx);
-            let polyline = itemGroup.childAt(0) as graphic.Polyline;
-            let polygon = itemGroup.childAt(1) as graphic.Polygon;
-            let symbolGroup = itemGroup.childAt(2) as graphic.Group;
-            let color = data.getItemVisual(idx, 'color');
+            const itemModel = data.getItemModel<RadarSeriesDataItemOption>(idx);
+            const polyline = itemGroup.childAt(0) as graphic.Polyline;
+            const polygon = itemGroup.childAt(1) as graphic.Polygon;
+            const symbolGroup = itemGroup.childAt(2) as graphic.Group;
+            const color = data.getItemVisual(idx, 'color');
 
             group.add(itemGroup);
 
@@ -194,9 +194,9 @@ class RadarView extends ChartView {
             const polylineEmphasisState = polyline.ensureState('emphasis');
             polylineEmphasisState.style = itemModel.getModel(['emphasis', 'lineStyle']).getLineStyle();
 
-            let areaStyleModel = itemModel.getModel('areaStyle');
-            let hoverAreaStyleModel = itemModel.getModel(['emphasis', 'areaStyle']);
-            let polygonIgnore = areaStyleModel.isEmpty() && areaStyleModel.parentModel.isEmpty();
+            const areaStyleModel = itemModel.getModel('areaStyle');
+            const hoverAreaStyleModel = itemModel.getModel(['emphasis', 'areaStyle']);
+            const polygonIgnore = areaStyleModel.isEmpty() && areaStyleModel.parentModel.isEmpty();
             let hoverPolygonIgnore = hoverAreaStyleModel.isEmpty() && hoverAreaStyleModel.parentModel.isEmpty();
 
             hoverPolygonIgnore = hoverPolygonIgnore && polygonIgnore;
@@ -214,10 +214,10 @@ class RadarView extends ChartView {
             const polygonEmphasisState = polygon.ensureState('emphasis');
             polygonEmphasisState.style = hoverAreaStyleModel.getAreaStyle();
 
-            let itemStyle = itemModel.getModel('itemStyle').getItemStyle(['color']);
-            let itemHoverStyle = itemModel.getModel(['emphasis', 'itemStyle']).getItemStyle();
-            let labelModel = itemModel.getModel('label');
-            let labelHoverModel = itemModel.getModel(['emphasis', 'label']);
+            const itemStyle = itemModel.getModel('itemStyle').getItemStyle(['color']);
+            const itemHoverStyle = itemModel.getModel(['emphasis', 'itemStyle']).getItemStyle();
+            const labelModel = itemModel.getModel('label');
+            const labelHoverModel = itemModel.getModel(['emphasis', 'label']);
             symbolGroup.eachChild(function (symbolPath: RadarSymbol) {
                 symbolPath.setStyle(itemStyle);
                 const pathEmphasisState = symbolPath.ensureState('emphasis');
diff --git a/src/chart/radar/backwardCompat.ts b/src/chart/radar/backwardCompat.ts
index 4bf46b7..7898dce 100644
--- a/src/chart/radar/backwardCompat.ts
+++ b/src/chart/radar/backwardCompat.ts
@@ -28,7 +28,7 @@ export default function (option) {
         if (!zrUtil.isArray(polarOptArr)) {
             polarOptArr = [polarOptArr];
         }
-        let polarNotRadar = [];
+        const polarNotRadar = [];
         zrUtil.each(polarOptArr, function (polarOpt, idx) {
             if (polarOpt.indicator) {
                 if (polarOpt.type && !polarOpt.shape) {
diff --git a/src/chart/radar/radarLayout.ts b/src/chart/radar/radarLayout.ts
index 38d8d9d..b02439a 100644
--- a/src/chart/radar/radarLayout.ts
+++ b/src/chart/radar/radarLayout.ts
@@ -25,19 +25,19 @@ import Radar from '../../coord/radar/Radar';
 type Point = number[];
 export default function (ecModel: GlobalModel) {
     ecModel.eachSeriesByType('radar', function (seriesModel: RadarSeriesModel) {
-        let data = seriesModel.getData();
-        let points: Point[][] = [];
-        let coordSys = seriesModel.coordinateSystem;
+        const data = seriesModel.getData();
+        const points: Point[][] = [];
+        const coordSys = seriesModel.coordinateSystem;
         if (!coordSys) {
             return;
         }
 
-        let axes = coordSys.getIndicatorAxes();
+        const axes = coordSys.getIndicatorAxes();
 
         zrUtil.each(axes, function (axis, axisIndex) {
             data.each(data.mapDimension(axes[axisIndex].dim), function (val, dataIndex) {
                 points[dataIndex] = points[dataIndex] || [];
-                let point = coordSys.dataToPoint(val, axisIndex);
+                const point = coordSys.dataToPoint(val, axisIndex);
                 points[dataIndex][axisIndex] = isValidPoint(point)
                     ? point : getValueMissingPoint(coordSys);
             });
@@ -48,7 +48,7 @@ export default function (ecModel: GlobalModel) {
             // TODO
             // Is it appropriate to connect to the next data when some data is missing?
             // Or, should trade it like `connectNull` in line chart?
-            let firstPoint = zrUtil.find(points[idx], function (point) {
+            const firstPoint = zrUtil.find(points[idx], function (point) {
                 return isValidPoint(point);
             }) || getValueMissingPoint(coordSys);
 
diff --git a/src/chart/sankey/SankeySeries.ts b/src/chart/sankey/SankeySeries.ts
index 6bb7b4c..21ea491 100644
--- a/src/chart/sankey/SankeySeries.ts
+++ b/src/chart/sankey/SankeySeries.ts
@@ -156,11 +156,11 @@ class SankeySeriesModel extends SeriesModel<SankeySeriesOption> {
      * @return {module:echarts/data/List} storage initial data
      */
     getInitialData(option: SankeySeriesOption, ecModel: GlobalModel) {
-        let links = option.edges || option.links;
-        let nodes = option.data || option.nodes;
-        let levels = option.levels;
+        const links = option.edges || option.links;
+        const nodes = option.data || option.nodes;
+        const levels = option.levels;
         this.levelModels = [];
-        let levelModels = this.levelModels;
+        const levelModels = this.levelModels;
 
         for (let i = 0; i < levels.length; i++) {
             if (levels[i].depth != null && levels[i].depth >= 0) {
@@ -173,15 +173,15 @@ class SankeySeriesModel extends SeriesModel<SankeySeriesOption> {
             }
         }
         if (nodes && links) {
-            let graph = createGraphFromNodeEdge(nodes, links, this, true, beforeLink);
+            const graph = createGraphFromNodeEdge(nodes, links, this, true, beforeLink);
             return graph.data;
         }
         function beforeLink(nodeData: List, edgeData: List) {
             nodeData.wrapMethod('getItemModel', function (model, idx) {
                 model.customizeGetParent(function (this: Model, path: string | string[]) {
-                    let parentModel = this.parentModel as SankeySeriesModel;
-                    let nodeDepth = parentModel.getData().getItemLayout(idx).depth;
-                    let levelModel = parentModel.levelModels[nodeDepth];
+                    const parentModel = this.parentModel as SankeySeriesModel;
+                    const nodeDepth = parentModel.getData().getItemLayout(idx).depth;
+                    const levelModel = parentModel.levelModels[nodeDepth];
                     return levelModel || this.parentModel;
                 });
                 return model;
@@ -189,10 +189,10 @@ class SankeySeriesModel extends SeriesModel<SankeySeriesOption> {
 
             edgeData.wrapMethod('getItemModel', function (model, idx) {
                 model.customizeGetParent(function (this: Model, path: string | string[]) {
-                    let parentModel = this.parentModel as SankeySeriesModel;
-                    let edge = parentModel.getGraph().getEdgeByIndex(idx);
-                    let depth = edge.node1.getLayout().depth;
-                    let levelModel = parentModel.levelModels[depth];
+                    const parentModel = this.parentModel as SankeySeriesModel;
+                    const edge = parentModel.getGraph().getEdgeByIndex(idx);
+                    const depth = edge.node1.getLayout().depth;
+                    const levelModel = parentModel.levelModels[depth];
                     return levelModel || this.parentModel;
                 });
                 return model;
@@ -201,7 +201,7 @@ class SankeySeriesModel extends SeriesModel<SankeySeriesOption> {
     }
 
     setNodePosition(dataIndex: number, localPosition: number[]) {
-        let dataItem = this.option.data[dataIndex];
+        const dataItem = this.option.data[dataIndex];
         dataItem.localX = localPosition[0];
         dataItem.localY = localPosition[1];
     }
@@ -230,8 +230,8 @@ class SankeySeriesModel extends SeriesModel<SankeySeriesOption> {
     formatTooltip(dataIndex: number, multipleSeries: boolean, dataType: 'node' | 'edge') {
         // dataType === 'node' or empty do not show tooltip by default
         if (dataType === 'edge') {
-            let params = this.getDataParams(dataIndex, dataType);
-            let rawDataOpt = params.data;
+            const params = this.getDataParams(dataIndex, dataType);
+            const rawDataOpt = params.data;
             let html = rawDataOpt.source + ' -- ' + rawDataOpt.target;
             if (params.value) {
                 html += ' : ' + params.value;
@@ -239,17 +239,17 @@ class SankeySeriesModel extends SeriesModel<SankeySeriesOption> {
             return encodeHTML(html);
         }
         else if (dataType === 'node') {
-            let node = this.getGraph().getNodeByIndex(dataIndex);
-            let value = node.getLayout().value;
-            let name = this.getDataParams(dataIndex, dataType).data.name;
-            let html = value ? name + ' : ' + value : '';
+            const node = this.getGraph().getNodeByIndex(dataIndex);
+            const value = node.getLayout().value;
+            const name = this.getDataParams(dataIndex, dataType).data.name;
+            const html = value ? name + ' : ' + value : '';
             return encodeHTML(html);
         }
         return super.formatTooltip(dataIndex, multipleSeries);
     }
 
     optionUpdated() {
-        let option = this.option;
+        const option = this.option;
         if (option.focusNodeAdjacency === true) {
             option.focusNodeAdjacency = 'allEdges';
         }
@@ -257,10 +257,10 @@ class SankeySeriesModel extends SeriesModel<SankeySeriesOption> {
 
     // Override Series.getDataParams()
     getDataParams(dataIndex: number, dataType: 'node' | 'edge') {
-        let params = super.getDataParams(dataIndex, dataType);
+        const params = super.getDataParams(dataIndex, dataType);
         if (params.value == null && dataType === 'node') {
-            let node = this.getGraph().getNodeByIndex(dataIndex);
-            let nodeValue = node.getLayout().value;
+            const node = this.getGraph().getNodeByIndex(dataIndex);
+            const nodeValue = node.getLayout().value;
             params.value = nodeValue;
         }
         return params;
diff --git a/src/chart/sankey/SankeyView.ts b/src/chart/sankey/SankeyView.ts
index b8c3d6a..4785914 100644
--- a/src/chart/sankey/SankeyView.ts
+++ b/src/chart/sankey/SankeyView.ts
@@ -62,7 +62,7 @@ function fadeOutItem(
     opacityPath: readonly string[],
     opacityRatio?: number
 ) {
-    let el = item.getGraphicEl() as SankeyEl;
+    const el = item.getGraphicEl() as SankeyEl;
     let opacity = getItemOpacity(item, opacityPath);
 
     if (opacityRatio != null) {
@@ -83,8 +83,8 @@ function fadeInItem(
     item: GraphNode | GraphEdge,
     opacityPath: readonly string[]
 ) {
-    let opacity = getItemOpacity(item, opacityPath);
-    let el = item.getGraphicEl() as SankeyEl;
+    const opacity = getItemOpacity(item, opacityPath);
+    const el = item.getGraphicEl() as SankeyEl;
 
     // Support emphasis here.
     el.highlight && el.highlight();
@@ -129,7 +129,7 @@ class SankeyPath extends graphic.Path<SankeyPathProps> {
     }
 
     buildPath(ctx: CanvasRenderingContext2D, shape: SankeyPathShape) {
-        let extent = shape.extent;
+        const extent = shape.extent;
         ctx.moveTo(shape.x1, shape.y1);
         ctx.bezierCurveTo(
             shape.cpx1, shape.cpy1,
@@ -178,17 +178,17 @@ class SankeyView extends ChartView {
     private _unfocusDelayTimer: number;
 
     render(seriesModel: SankeySeriesModel, ecModel: GlobalModel, api: ExtensionAPI) {
-        let sankeyView = this;
-        let graph = seriesModel.getGraph();
-        let group = this.group;
-        let layoutInfo = seriesModel.layoutInfo;
+        const sankeyView = this;
+        const graph = seriesModel.getGraph();
+        const group = this.group;
+        const layoutInfo = seriesModel.layoutInfo;
         // view width
-        let width = layoutInfo.width;
+        const width = layoutInfo.width;
         // view height
-        let height = layoutInfo.height;
-        let nodeData = seriesModel.getData();
-        let edgeData = seriesModel.getData('edge');
-        let orient = seriesModel.get('orient');
+        const height = layoutInfo.height;
+        const nodeData = seriesModel.getData();
+        const edgeData = seriesModel.getData('edge');
+        const orient = seriesModel.get('orient');
 
         this._model = seriesModel;
 
@@ -198,8 +198,8 @@ class SankeyView extends ChartView {
 
         // generate a bezire Curve for each edge
         graph.eachEdge(function (edge) {
-            let curve = new SankeyPath();
-            let ecData = graphic.getECData(curve);
+            const curve = new SankeyPath();
+            const ecData = graphic.getECData(curve);
             ecData.dataIndex = edge.dataIndex;
             ecData.seriesIndex = seriesModel.seriesIndex;
             ecData.dataType = 'edge';
@@ -282,14 +282,14 @@ class SankeyView extends ChartView {
 
         // Generate a rect for each node
         graph.eachNode(function (node) {
-            let layout = node.getLayout();
-            let itemModel = node.getModel<SankeyNodeItemOption>();
-            let dragX = itemModel.get('localX');
-            let dragY = itemModel.get('localY');
-            let labelModel = itemModel.getModel('label');
-            let labelHoverModel = itemModel.getModel(['emphasis', 'label']);
-
-            let rect = new graphic.Rect({
+            const layout = node.getLayout();
+            const itemModel = node.getModel<SankeyNodeItemOption>();
+            const dragX = itemModel.get('localX');
+            const dragY = itemModel.get('localY');
+            const labelModel = itemModel.getModel('label');
+            const labelHoverModel = itemModel.getModel(['emphasis', 'label']);
+
+            const rect = new graphic.Rect({
                 shape: {
                     x: dragX != null ? dragX * width : layout.x,
                     y: dragY != null ? dragY * height : layout.y,
@@ -299,7 +299,7 @@ class SankeyView extends ChartView {
                 style: itemModel.getModel('itemStyle').getItemStyle()
             });
 
-            let hoverStyle = itemModel.getModel(['emphasis', 'itemStyle']).getItemStyle();
+            const hoverStyle = itemModel.getModel(['emphasis', 'itemStyle']).getItemStyle();
 
             graphic.setLabelStyle(
                 rect, labelModel, labelHoverModel,
@@ -322,7 +322,7 @@ class SankeyView extends ChartView {
         });
 
         nodeData.eachItemGraphicEl(function (el: graphic.Rect & SankeyEl, dataIndex: number) {
-            let itemModel = nodeData.getItemModel<SankeyNodeItemOption>(dataIndex);
+            const itemModel = nodeData.getItemModel<SankeyNodeItemOption>(dataIndex);
             if (itemModel.get('draggable')) {
                 el.drift = function (this: typeof el, dx, dy) {
                     sankeyView._focusAdjacencyDisabled = true;
@@ -376,7 +376,7 @@ class SankeyView extends ChartView {
         });
 
         edgeData.eachItemGraphicEl(function (el: SankeyPath & SankeyEl, dataIndex) {
-            let edgeModel = edgeData.getItemModel<GraphEdgeItemOption>(dataIndex);
+            const edgeModel = edgeData.getItemModel<GraphEdgeItemOption>(dataIndex);
 
             el.focusNodeAdjHandler && el.off('mouseover', el.focusNodeAdjHandler);
             el.unfocusNodeAdjHandler && el.off('mouseout', el.unfocusNodeAdjHandler);
@@ -415,7 +415,7 @@ class SankeyView extends ChartView {
     }
 
     _dispatchUnfocus(api: ExtensionAPI) {
-        let self = this;
+        const self = this;
         this._clearTimer();
         this._unfocusDelayTimer = setTimeout(function () {
             self._unfocusDelayTimer = null;
@@ -439,17 +439,17 @@ class SankeyView extends ChartView {
         api: ExtensionAPI,
         payload: FocusNodeAdjacencyPayload
     ) {
-        let data = seriesModel.getData();
-        let graph = data.graph;
-        let dataIndex = payload.dataIndex;
-        let itemModel = data.getItemModel<SankeyNodeItemOption>(dataIndex);
-        let edgeDataIndex = payload.edgeDataIndex;
+        const data = seriesModel.getData();
+        const graph = data.graph;
+        const dataIndex = payload.dataIndex;
+        const itemModel = data.getItemModel<SankeyNodeItemOption>(dataIndex);
+        const edgeDataIndex = payload.edgeDataIndex;
 
         if (dataIndex == null && edgeDataIndex == null) {
             return;
         }
-        let node = graph.getNodeByIndex(dataIndex);
-        let edge = graph.getEdgeByIndex(edgeDataIndex);
+        const node = graph.getNodeByIndex(dataIndex);
+        const edge = graph.getEdgeByIndex(edgeDataIndex);
 
         graph.eachNode(function (node) {
             fadeOutItem(node, nodeOpacityPath, 0.1);
@@ -460,7 +460,7 @@ class SankeyView extends ChartView {
 
         if (node) {
             fadeInItem(node, hoverNodeOpacityPath);
-            let focusNodeAdj = itemModel.get('focusNodeAdjacency');
+            const focusNodeAdj = itemModel.get('focusNodeAdjacency');
             if (focusNodeAdj === 'outEdges') {
                 zrUtil.each(node.outEdges, function (edge) {
                     if (edge.dataIndex < 0) {
@@ -500,7 +500,7 @@ class SankeyView extends ChartView {
     unfocusNodeAdjacency(
         seriesModel: SankeySeriesModel
     ) {
-        let graph = seriesModel.getGraph();
+        const graph = seriesModel.getGraph();
 
         graph.eachNode(function (node) {
             fadeOutItem(node, nodeOpacityPath);
@@ -513,7 +513,7 @@ class SankeyView extends ChartView {
 
 // Add animation to the view
 function createGridClipShape(rect: RectLike, seriesModel: SankeySeriesModel, cb: () => void) {
-    let rectEl = new graphic.Rect({
+    const rectEl = new graphic.Rect({
         shape: {
             x: rect.x - 10,
             y: rect.y - 10,
diff --git a/src/chart/sankey/sankeyLayout.ts b/src/chart/sankey/sankeyLayout.ts
index 6411eb9..473d1ff 100644
--- a/src/chart/sankey/sankeyLayout.ts
+++ b/src/chart/sankey/sankeyLayout.ts
@@ -30,32 +30,32 @@ export default function (ecModel: GlobalModel, api: ExtensionAPI) {
 
     ecModel.eachSeriesByType('sankey', function (seriesModel: SankeySeriesModel) {
 
-        let nodeWidth = seriesModel.get('nodeWidth');
-        let nodeGap = seriesModel.get('nodeGap');
+        const nodeWidth = seriesModel.get('nodeWidth');
+        const nodeGap = seriesModel.get('nodeGap');
 
-        let layoutInfo = getViewRect(seriesModel, api);
+        const layoutInfo = getViewRect(seriesModel, api);
 
         seriesModel.layoutInfo = layoutInfo;
 
-        let width = layoutInfo.width;
-        let height = layoutInfo.height;
+        const width = layoutInfo.width;
+        const height = layoutInfo.height;
 
-        let graph = seriesModel.getGraph();
+        const graph = seriesModel.getGraph();
 
-        let nodes = graph.nodes;
-        let edges = graph.edges;
+        const nodes = graph.nodes;
+        const edges = graph.edges;
 
         computeNodeValues(nodes);
 
-        let filteredNodes = zrUtil.filter(nodes, function (node) {
+        const filteredNodes = zrUtil.filter(nodes, function (node) {
             return node.getLayout().value === 0;
         });
 
-        let iterations = filteredNodes.length !== 0 ? 0 : seriesModel.get('layoutIterations');
+        const iterations = filteredNodes.length !== 0 ? 0 : seriesModel.get('layoutIterations');
 
-        let orient = seriesModel.get('orient');
+        const orient = seriesModel.get('orient');
 
-        let nodeAlign = seriesModel.get('nodeAlign');
+        const nodeAlign = seriesModel.get('nodeAlign');
 
         layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations, orient, nodeAlign);
     });
@@ -94,10 +94,10 @@ function layoutSankey(
  */
 function computeNodeValues(nodes: GraphNode[]) {
     zrUtil.each(nodes, function (node) {
-        let value1 = sum(node.outEdges, getEdgeValue);
-        let value2 = sum(node.inEdges, getEdgeValue);
-        let nodeRawValue = node.getValue() as number || 0;
-        let value = Math.max(value1, value2, nodeRawValue);
+        const value1 = sum(node.outEdges, getEdgeValue);
+        const value2 = sum(node.inEdges, getEdgeValue);
+        const nodeRawValue = node.getValue() as number || 0;
+        const value = Math.max(value1, value2, nodeRawValue);
         node.setLayout({value: value}, true);
     });
 }
@@ -119,9 +119,9 @@ function computeNodeBreadths(
 ) {
     // Used to mark whether the edge is deleted. if it is deleted,
     // the value is 0, otherwise it is 1.
-    let remainEdges = [];
+    const remainEdges = [];
     // Storage each node's indegree.
-    let indegreeArr = [];
+    const indegreeArr = [];
     //Used to storage the node with indegree is equal to 0.
     let zeroIndegrees: GraphNode[] = [];
     let nextTargetNode: GraphNode[] = [];
@@ -143,9 +143,9 @@ function computeNodeBreadths(
     // position of the nodes.
     while (zeroIndegrees.length) {
         for (let idx = 0; idx < zeroIndegrees.length; idx++) {
-            let node = zeroIndegrees[idx];
-            let item = node.hostGraph.data.getRawDataItem(node.dataIndex) as SankeyNodeItemOption;
-            let isItemDepth = item.depth != null && item.depth >= 0;
+            const node = zeroIndegrees[idx];
+            const item = node.hostGraph.data.getRawDataItem(node.dataIndex) as SankeyNodeItemOption;
+            const isItemDepth = item.depth != null && item.depth >= 0;
             if (isItemDepth && item.depth > maxNodeDepth) {
                 maxNodeDepth = item.depth;
             }
@@ -155,11 +155,11 @@ function computeNodeBreadths(
                 : node.setLayout({dx: nodeWidth}, true);
 
             for (let edgeIdx = 0; edgeIdx < node.outEdges.length; edgeIdx++) {
-                let edge = node.outEdges[edgeIdx];
-                let indexEdge = edges.indexOf(edge);
+                const edge = node.outEdges[edgeIdx];
+                const indexEdge = edges.indexOf(edge);
                 remainEdges[indexEdge] = 0;
-                let targetNode = edge.node2;
-                let nodeIndex = nodes.indexOf(targetNode);
+                const targetNode = edge.node2;
+                const nodeIndex = nodes.indexOf(targetNode);
                 if (--indegreeArr[nodeIndex] === 0 && nextTargetNode.indexOf(targetNode) < 0) {
                     nextTargetNode.push(targetNode);
                 }
@@ -176,11 +176,11 @@ function computeNodeBreadths(
         }
     }
 
-    let maxDepth = maxNodeDepth > x - 1 ? maxNodeDepth : x - 1;
+    const maxDepth = maxNodeDepth > x - 1 ? maxNodeDepth : x - 1;
     if (nodeAlign && nodeAlign !== 'left') {
         adjustNodeWithNodeAlign(nodes, nodeAlign, orient, maxDepth);
     }
-    let kx = orient === 'vertical'
+    const kx = orient === 'vertical'
         ? (height - nodeWidth) / maxDepth
         : (width - nodeWidth) / maxDepth;
 
@@ -188,7 +188,7 @@ function computeNodeBreadths(
 }
 
 function isNodeDepth(node: GraphNode) {
-    let item = node.hostGraph.data.getRawDataItem(node.dataIndex) as SankeyNodeItemOption;
+    const item = node.hostGraph.data.getRawDataItem(node.dataIndex) as SankeyNodeItemOption;
     return item.depth != null && item.depth >= 0;
 }
 
@@ -204,10 +204,10 @@ function adjustNodeWithNodeAlign(
         let nodeHeight = 0;
         while (remainNodes.length) {
             for (let i = 0; i < remainNodes.length; i++) {
-                let node = remainNodes[i];
+                const node = remainNodes[i];
                 node.setLayout({skNodeHeight: nodeHeight}, true);
                 for (let j = 0; j < node.inEdges.length; j++) {
-                    let edge = node.inEdges[j];
+                    const edge = node.inEdges[j];
                     if (nextSourceNode.indexOf(edge.node1) < 0) {
                         nextSourceNode.push(edge.node1);
                     }
@@ -252,7 +252,7 @@ function moveSinksRight(nodes: GraphNode[], maxDepth: number) {
  */
 function scaleNodeBreadths(nodes: GraphNode[], kx: number, orient: LayoutOrient) {
     zrUtil.each(nodes, function (node) {
-        let nodeDepth = node.getLayout().depth * kx;
+        const nodeDepth = node.getLayout().depth * kx;
         orient === 'vertical'
             ? node.setLayout({y: nodeDepth}, true)
             : node.setLayout({x: nodeDepth}, true);
@@ -278,7 +278,7 @@ function computeNodeDepths(
     iterations: number,
     orient: LayoutOrient
 ) {
-    let nodesByBreadth = prepareNodesByBreadth(nodes, orient);
+    const nodesByBreadth = prepareNodesByBreadth(nodes, orient);
 
     initializeNodeDepth(nodesByBreadth, edges, height, width, nodeGap, orient);
     resolveCollisions(nodesByBreadth, nodeGap, height, width, orient);
@@ -295,10 +295,10 @@ function computeNodeDepths(
 }
 
 function prepareNodesByBreadth(nodes: GraphNode[], orient: LayoutOrient) {
-    let nodesByBreadth: GraphNode[][] = [];
-    let keyAttr = orient === 'vertical' ? 'y' : 'x';
+    const nodesByBreadth: GraphNode[][] = [];
+    const keyAttr = orient === 'vertical' ? 'y' : 'x';
 
-    let groupResult = groupData(nodes, function (node) {
+    const groupResult = groupData(nodes, function (node) {
         return node.getLayout()[keyAttr] as number;
     });
     groupResult.keys.sort(function (a, b) {
@@ -324,12 +324,12 @@ function initializeNodeDepth(
 ) {
     let minKy = Infinity;
     zrUtil.each(nodesByBreadth, function (nodes) {
-        let n = nodes.length;
+        const n = nodes.length;
         let sum = 0;
         zrUtil.each(nodes, function (node) {
             sum += node.getLayout().value;
         });
-        let ky = orient === 'vertical'
+        const ky = orient === 'vertical'
                     ? (width - (n - 1) * nodeGap) / sum
                     : (height - (n - 1) * nodeGap) / sum;
 
@@ -340,7 +340,7 @@ function initializeNodeDepth(
 
     zrUtil.each(nodesByBreadth, function (nodes) {
         zrUtil.each(nodes, function (node, i) {
-            let nodeDy = node.getLayout().value * minKy;
+            const nodeDy = node.getLayout().value * minKy;
             if (orient === 'vertical') {
                 node.setLayout({x: i}, true);
                 node.setLayout({dx: nodeDy}, true);
@@ -353,7 +353,7 @@ function initializeNodeDepth(
     });
 
     zrUtil.each(edges, function (edge) {
-        let edgeDy = +edge.getValue() * minKy;
+        const edgeDy = +edge.getValue() * minKy;
         edge.setLayout({dy: edgeDy}, true);
     });
 }
@@ -368,7 +368,7 @@ function resolveCollisions(
     width: number,
     orient: LayoutOrient
 ) {
-    let keyAttr = orient === 'vertical' ? 'x' : 'y';
+    const keyAttr = orient === 'vertical' ? 'x' : 'y';
     zrUtil.each(nodesByBreadth, function (nodes) {
         nodes.sort(function (a, b) {
             return a.getLayout()[keyAttr] - b.getLayout()[keyAttr];
@@ -377,8 +377,8 @@ function resolveCollisions(
         let node;
         let dy;
         let y0 = 0;
-        let n = nodes.length;
-        let nodeDyAttr = orient === 'vertical' ? 'dx' : 'dy';
+        const n = nodes.length;
+        const nodeDyAttr = orient === 'vertical' ? 'dx' : 'dy';
         for (let i = 0; i < n; i++) {
             node = nodes[i];
             dy = y0 - node.getLayout()[keyAttr];
@@ -390,7 +390,7 @@ function resolveCollisions(
             }
             y0 = node.getLayout()[keyAttr] + node.getLayout()[nodeDyAttr] + nodeGap;
         }
-        let viewWidth = orient === 'vertical' ? width : height;
+        const viewWidth = orient === 'vertical' ? width : height;
         // If the bottommost node goes outside the bounds, push it back up
         dy = y0 - nodeGap - viewWidth;
         if (dy > 0) {
@@ -428,14 +428,14 @@ function relaxRightToLeft(
     zrUtil.each(nodesByBreadth.slice().reverse(), function (nodes) {
         zrUtil.each(nodes, function (node) {
             if (node.outEdges.length) {
-                let y = sum(node.outEdges, weightedTarget, orient)
+                const y = sum(node.outEdges, weightedTarget, orient)
                     / sum(node.outEdges, getEdgeValue);
                 if (orient === 'vertical') {
-                    let nodeX = node.getLayout().x + (y - center(node, orient)) * alpha;
+                    const nodeX = node.getLayout().x + (y - center(node, orient)) * alpha;
                     node.setLayout({x: nodeX}, true);
                 }
                 else {
-                    let nodeY = node.getLayout().y + (y - center(node, orient)) * alpha;
+                    const nodeY = node.getLayout().y + (y - center(node, orient)) * alpha;
                     node.setLayout({y: nodeY}, true);
                 }
             }
@@ -463,10 +463,10 @@ function getEdgeValue(edge: GraphEdge) {
 
 function sum<T>(array: T[], cb: (item: T, orient?: LayoutOrient) => number, orient?: LayoutOrient) {
     let sum = 0;
-    let len = array.length;
+    const len = array.length;
     let i = -1;
     while (++i < len) {
-        let value = +cb(array[i], orient);
+        const value = +cb(array[i], orient);
         if (!isNaN(value)) {
             sum += value;
         }
@@ -481,14 +481,14 @@ function relaxLeftToRight(nodesByBreadth: GraphNode[][], alpha: number, orient:
     zrUtil.each(nodesByBreadth, function (nodes) {
         zrUtil.each(nodes, function (node) {
             if (node.inEdges.length) {
-                let y = sum(node.inEdges, weightedSource, orient)
+                const y = sum(node.inEdges, weightedSource, orient)
                         / sum(node.inEdges, getEdgeValue);
                 if (orient === 'vertical') {
-                    let nodeX = node.getLayout().x + (y - center(node, orient)) * alpha;
+                    const nodeX = node.getLayout().x + (y - center(node, orient)) * alpha;
                     node.setLayout({x: nodeX}, true);
                 }
                 else {
-                    let nodeY = node.getLayout().y + (y - center(node, orient)) * alpha;
+                    const nodeY = node.getLayout().y + (y - center(node, orient)) * alpha;
                     node.setLayout({y: nodeY}, true);
                 }
             }
@@ -500,7 +500,7 @@ function relaxLeftToRight(nodesByBreadth: GraphNode[][], alpha: number, orient:
  * Compute the depth(y-position) of each edge
  */
 function computeEdgeDepths(nodes: GraphNode[], orient: LayoutOrient) {
-    let keyAttr = orient === 'vertical' ? 'x' : 'y';
+    const keyAttr = orient === 'vertical' ? 'x' : 'y';
     zrUtil.each(nodes, function (node) {
         node.outEdges.sort(function (a, b) {
             return a.node2.getLayout()[keyAttr] - b.node2.getLayout()[keyAttr];
diff --git a/src/chart/sankey/sankeyVisual.ts b/src/chart/sankey/sankeyVisual.ts
index 2e6fc14..5e1b2b6 100644
--- a/src/chart/sankey/sankeyVisual.ts
+++ b/src/chart/sankey/sankeyVisual.ts
@@ -24,13 +24,13 @@ import SankeySeriesModel, { SankeyNodeItemOption } from './SankeySeries';
 
 export default function (ecModel: GlobalModel) {
     ecModel.eachSeriesByType('sankey', function (seriesModel: SankeySeriesModel) {
-        let graph = seriesModel.getGraph();
-        let nodes = graph.nodes;
+        const graph = seriesModel.getGraph();
+        const nodes = graph.nodes;
         if (nodes.length) {
             let minValue = Infinity;
             let maxValue = -Infinity;
             zrUtil.each(nodes, function (node) {
-                let nodeValue = node.getLayout().value;
+                const nodeValue = node.getLayout().value;
                 if (nodeValue < minValue) {
                     minValue = nodeValue;
                 }
@@ -40,15 +40,15 @@ export default function (ecModel: GlobalModel) {
             });
 
             zrUtil.each(nodes, function (node) {
-                let mapping = new VisualMapping({
+                const mapping = new VisualMapping({
                     type: 'color',
                     mappingMethod: 'linear',
                     dataExtent: [minValue, maxValue],
                     visual: seriesModel.get('color')
                 });
 
-                let mapValueToColor = mapping.mapValueToVisual(node.getLayout().value);
-                let customColor = node.getModel<SankeyNodeItemOption>().get(['itemStyle', 'color']);
+                const mapValueToColor = mapping.mapValueToVisual(node.getLayout().value);
+                const customColor = node.getModel<SankeyNodeItemOption>().get(['itemStyle', 'color']);
                 customColor != null
                     ? node.setVisual('color', customColor)
                     : node.setVisual('color', mapValueToColor);
diff --git a/src/chart/scatter/ScatterSeries.ts b/src/chart/scatter/ScatterSeries.ts
index 86cd0aa..d1c58b2 100644
--- a/src/chart/scatter/ScatterSeries.ts
+++ b/src/chart/scatter/ScatterSeries.ts
@@ -94,7 +94,7 @@ class ScatterSeriesModel extends SeriesModel<ScatterSeriesOption> {
 
 
     getProgressive() {
-        let progressive = this.option.progressive;
+        const progressive = this.option.progressive;
         if (progressive == null) {
             // PENDING
             return this.option.large ? 5e3 : this.get('progressive');
@@ -103,7 +103,7 @@ class ScatterSeriesModel extends SeriesModel<ScatterSeriesOption> {
     }
 
     getProgressiveThreshold() {
-        let progressiveThreshold = this.option.progressiveThreshold;
+        const progressiveThreshold = this.option.progressiveThreshold;
         if (progressiveThreshold == null) {
             // PENDING
             return this.option.large ? 1e4 : this.get('progressiveThreshold');
diff --git a/src/chart/scatter/ScatterView.ts b/src/chart/scatter/ScatterView.ts
index cc90582..2885329 100644
--- a/src/chart/scatter/ScatterView.ts
+++ b/src/chart/scatter/ScatterView.ts
@@ -40,9 +40,9 @@ class ScatterView extends ChartView {
     _symbolDraw: SymbolDraw | LargeSymbolDraw;
 
     render(seriesModel: ScatterSeriesModel, ecModel: GlobalModel, api: ExtensionAPI) {
-        let data = seriesModel.getData();
+        const data = seriesModel.getData();
 
-        let symbolDraw = this._updateSymbolDraw(data, seriesModel);
+        const symbolDraw = this._updateSymbolDraw(data, seriesModel);
 
         symbolDraw.updateData(data, {
             // TODO
@@ -56,8 +56,8 @@ class ScatterView extends ChartView {
     }
 
     incrementalPrepareRender(seriesModel: ScatterSeriesModel, ecModel: GlobalModel, api: ExtensionAPI) {
-        let data = seriesModel.getData();
-        let symbolDraw = this._updateSymbolDraw(data, seriesModel);
+        const data = seriesModel.getData();
+        const symbolDraw = this._updateSymbolDraw(data, seriesModel);
 
         symbolDraw.incrementalPrepareUpdate(data);
 
@@ -73,7 +73,7 @@ class ScatterView extends ChartView {
     }
 
     updateTransform(seriesModel: ScatterSeriesModel, ecModel: GlobalModel, api: ExtensionAPI): void | { update: true } {
-        let data = seriesModel.getData();
+        const data = seriesModel.getData();
         // Must mark group dirty and make sure the incremental layer will be cleared
         // PENDING
         this.group.dirty();
@@ -84,7 +84,7 @@ class ScatterView extends ChartView {
             };
         }
         else {
-            let res = pointsLayout().reset(seriesModel, ecModel, api) as StageHandlerProgressExecutor;
+            const res = pointsLayout().reset(seriesModel, ecModel, api) as StageHandlerProgressExecutor;
             if (res.progress) {
                 res.progress({ start: 0, end: data.count(), count: data.count() }, data);
             }
@@ -94,15 +94,15 @@ class ScatterView extends ChartView {
     }
 
     _getClipShape(seriesModel: ScatterSeriesModel) {
-        let coordSys = seriesModel.coordinateSystem;
-        let clipArea = coordSys && coordSys.getArea && coordSys.getArea();
+        const coordSys = seriesModel.coordinateSystem;
+        const clipArea = coordSys && coordSys.getArea && coordSys.getArea();
         return seriesModel.get('clip', true) ? clipArea : null;
     }
 
     _updateSymbolDraw(data: List, seriesModel: ScatterSeriesModel) {
         let symbolDraw = this._symbolDraw;
-        let pipelineContext = seriesModel.pipelineContext;
-        let isLargeDraw = pipelineContext.large;
+        const pipelineContext = seriesModel.pipelineContext;
+        const isLargeDraw = pipelineContext.large;
 
         if (!symbolDraw || isLargeDraw !== this._isLargeDraw) {
             symbolDraw && symbolDraw.remove();
diff --git a/src/chart/sunburst/SunburstPiece.ts b/src/chart/sunburst/SunburstPiece.ts
index fd4ca41..dba74f5 100644
--- a/src/chart/sunburst/SunburstPiece.ts
+++ b/src/chart/sunburst/SunburstPiece.ts
@@ -51,7 +51,7 @@ class SunburstPiece extends graphic.Group {
     constructor(node: TreeNode, seriesModel: SunburstSeriesModel, ecModel: GlobalModel) {
         super();
 
-        let sector = new graphic.Sector({
+        const sector = new graphic.Sector({
             z2: DEFAULT_SECTOR_Z,
             textConfig: {
                 inside: true
@@ -60,7 +60,7 @@ class SunburstPiece extends graphic.Group {
         this.add(sector);
         graphic.getECData(sector).seriesIndex = seriesModel.seriesIndex;
 
-        let text = new graphic.Text({
+        const text = new graphic.Text({
             z2: DEFAULT_TEXT_Z,
             silent: node.getModel<SunburstSeriesNodeOption>().get(['label', 'silent'])
         });
@@ -95,28 +95,28 @@ class SunburstPiece extends graphic.Group {
         seriesModel = seriesModel || this._seriesModel;
         ecModel = ecModel || this._ecModel;
 
-        let sector = this.childAt(0) as graphic.Sector;
+        const sector = this.childAt(0) as graphic.Sector;
         graphic.getECData(sector).dataIndex = node.dataIndex;
 
-        let itemModel = node.getModel<SunburstSeriesNodeOption>();
-        let layout = node.getLayout();
+        const itemModel = node.getModel<SunburstSeriesNodeOption>();
+        const layout = node.getLayout();
         // if (!layout) {
         //     console.log(node.getLayout());
         // }
-        let sectorShape = zrUtil.extend({}, layout);
+        const sectorShape = zrUtil.extend({}, layout);
         sectorShape.label = null;
 
-        let visualColor = getNodeColor(node, seriesModel, ecModel);
+        const visualColor = getNodeColor(node, seriesModel, ecModel);
 
         fillDefaultColor(node, seriesModel, visualColor);
 
-        let normalStyle = itemModel.getModel('itemStyle').getItemStyle();
+        const normalStyle = itemModel.getModel('itemStyle').getItemStyle();
         let style;
         if (state === 'normal') {
             style = normalStyle;
         }
         else {
-            let stateStyle = itemModel.getModel([state, 'itemStyle'])
+            const stateStyle = itemModel.getModel([state, 'itemStyle'])
                 .getItemStyle();
             style = zrUtil.merge(stateStyle, normalStyle);
         }
@@ -162,11 +162,11 @@ class SunburstPiece extends graphic.Group {
 
         this._updateLabel(seriesModel, visualColor, state);
 
-        let cursorStyle = itemModel.getShallow('cursor');
+        const cursorStyle = itemModel.getShallow('cursor');
         cursorStyle && sector.attr('cursor', cursorStyle);
 
         if (firstCreate) {
-            let highlightPolicy = seriesModel.getShallow('highlightPolicy');
+            const highlightPolicy = seriesModel.getShallow('highlightPolicy');
             this._initEvents(sector, node, seriesModel, highlightPolicy);
         }
 
@@ -175,7 +175,7 @@ class SunburstPiece extends graphic.Group {
     }
 
     onEmphasis(highlightPolicy: AllPropTypes<typeof NodeHighlightPolicy>) {
-        let that = this;
+        const that = this;
         this.node.hostTree.root.eachNode(function (n: DrawTreeNode) {
             if (n.piece) {
                 if (that.node === n) {
@@ -212,12 +212,12 @@ class SunburstPiece extends graphic.Group {
         visualColor: ColorString,
         state: 'emphasis' | 'normal' | 'highlight' | 'downplay'
     ) {
-        let itemModel = this.node.getModel<SunburstSeriesNodeOption>();
-        let normalModel = itemModel.getModel('label');
-        let labelModel = state === 'normal' || state === 'emphasis'
+        const itemModel = this.node.getModel<SunburstSeriesNodeOption>();
+        const normalModel = itemModel.getModel('label');
+        const labelModel = state === 'normal' || state === 'emphasis'
             ? normalModel
             : itemModel.getModel([state, 'label']);
-        let labelHoverModel = itemModel.getModel(['emphasis', 'label']);
+        const labelHoverModel = itemModel.getModel(['emphasis', 'label']);
 
         let text = zrUtil.retrieve(
             seriesModel.getFormattedLabel(
@@ -229,20 +229,20 @@ class SunburstPiece extends graphic.Group {
             text = '';
         }
 
-        let layout = this.node.getLayout();
+        const layout = this.node.getLayout();
         let labelMinAngle = labelModel.get('minAngle');
         if (labelMinAngle == null) {
             labelMinAngle = normalModel.get('minAngle');
         }
         labelMinAngle = labelMinAngle / 180 * Math.PI;
-        let angle = layout.endAngle - layout.startAngle;
+        const angle = layout.endAngle - layout.startAngle;
         if (labelMinAngle != null && Math.abs(angle) < labelMinAngle) {
             // Not displaying text when angle is too small
             text = '';
         }
 
-        let sector = this.childAt(0);
-        let label = sector.getTextContent();
+        const sector = this.childAt(0);
+        const label = sector.getTextContent();
 
         graphic.setLabelStyle(
             label, normalModel, labelHoverModel,
@@ -258,13 +258,13 @@ class SunburstPiece extends graphic.Group {
             outsideFill: visualColor
         });
 
-        let midAngle = (layout.startAngle + layout.endAngle) / 2;
-        let dx = Math.cos(midAngle);
-        let dy = Math.sin(midAngle);
+        const midAngle = (layout.startAngle + layout.endAngle) / 2;
+        const dx = Math.cos(midAngle);
+        const dy = Math.sin(midAngle);
 
         let r;
-        let labelPosition = getLabelAttr('position');
-        let labelPadding = getLabelAttr('distance') || 0;
+        const labelPosition = getLabelAttr('position');
+        const labelPadding = getLabelAttr('distance') || 0;
         let textAlign = getLabelAttr('align');
         if (labelPosition === 'outside') {
             r = layout.r + labelPadding;
@@ -296,11 +296,11 @@ class SunburstPiece extends graphic.Group {
             opacity: getLabelAttr('opacity')
         });
 
-        let textX = r * dx + layout.cx;
-        let textY = r * dy + layout.cy;
+        const textX = r * dx + layout.cx;
+        const textY = r * dy + layout.cy;
         label.attr('position', [textX, textY]);
 
-        let rotateType = getLabelAttr('rotate');
+        const rotateType = getLabelAttr('rotate');
         let rotate = 0;
         if (rotateType === 'radial') {
             rotate = -midAngle;
@@ -324,7 +324,7 @@ class SunburstPiece extends graphic.Group {
 
         type LabelOption = SunburstSeriesNodeOption['label'];
         function getLabelAttr<T extends keyof LabelOption>(name: T): LabelOption[T] {
-            let stateAttr = labelModel.get(name);
+            const stateAttr = labelModel.get(name);
             if (stateAttr == null) {
                 return normalModel.get(name);
             }
@@ -342,17 +342,17 @@ class SunburstPiece extends graphic.Group {
     ) {
         sector.off('mouseover').off('mouseout').off('emphasis').off('normal');
 
-        let that = this;
-        let onEmphasis = function () {
+        const that = this;
+        const onEmphasis = function () {
             that.onEmphasis(highlightPolicy);
         };
-        let onNormal = function () {
+        const onNormal = function () {
             that.onNormal();
         };
-        let onDownplay = function () {
+        const onDownplay = function () {
             that.onDownplay();
         };
-        let onHighlight = function () {
+        const onHighlight = function () {
             that.onHighlight();
         };
 
@@ -383,7 +383,7 @@ function getNodeColor(
 ) {
     // Color from visualMap
     let visualColor = node.getVisual('color');
-    let visualMetaList = node.getVisual('visualMeta');
+    const visualMetaList = node.getVisual('visualMeta');
     if (!visualMetaList || visualMetaList.length === 0) {
         // Use first-generation color if has no visualMap
         visualColor = null;
@@ -404,7 +404,7 @@ function getNodeColor(
     }
     else {
         // First-generation color
-        let length = ecModel.option.color.length;
+        const length = ecModel.option.color.length;
         color = ecModel.option.color[getRootId(node) % length];
     }
     return color;
@@ -422,7 +422,7 @@ function getRootId(node: TreeNode) {
         ancestor = ancestor.parentNode;
     }
 
-    let virtualRoot = node.getAncestors()[0];
+    const virtualRoot = node.getAncestors()[0];
     return zrUtil.indexOf(virtualRoot.children, ancestor);
 }
 
@@ -447,6 +447,6 @@ function isNodeHighlighted(
 
 // Fix tooltip callback function params.color incorrect when pick a default color
 function fillDefaultColor(node: TreeNode, seriesModel: SunburstSeriesModel, color: ZRColor) {
-    let data = seriesModel.getData();
+    const data = seriesModel.getData();
     data.setItemVisual(node.dataIndex, 'color', color);
 }
diff --git a/src/chart/sunburst/SunburstSeries.ts b/src/chart/sunburst/SunburstSeries.ts
index 1fd10c0..6211e01 100644
--- a/src/chart/sunburst/SunburstSeries.ts
+++ b/src/chart/sunburst/SunburstSeries.ts
@@ -154,15 +154,15 @@ class SunburstSeriesModel extends SeriesModel<SunburstSeriesOption> {
 
     getInitialData(option: SunburstSeriesOption, ecModel: GlobalModel) {
         // Create a virtual root.
-        let root = { name: option.name, children: option.data };
+        const root = { name: option.name, children: option.data };
 
         completeTreeValue(root);
 
-        let levels = option.levels || [];
+        const levels = option.levels || [];
 
         // levels = option.levels = setDefault(levels, ecModel);
 
-        let treeOption = {
+        const treeOption = {
             levels: levels
         };
 
@@ -180,9 +180,9 @@ class SunburstSeriesModel extends SeriesModel<SunburstSeriesOption> {
      * @override
      */
     getDataParams(dataIndex: number) {
-        let params = super.getDataParams.apply(this, arguments as any) as SunburstDataParams;
+        const params = super.getDataParams.apply(this, arguments as any) as SunburstDataParams;
 
-        let node = this.getData().tree.getNodeByDataIndex(dataIndex);
+        const node = this.getData().tree.getNodeByDataIndex(dataIndex);
         params.treePathInfo = wrapTreePathInfo<SunburstSeriesNodeOption['value']>(node, this);
 
         return params;
@@ -280,7 +280,7 @@ class SunburstSeriesModel extends SeriesModel<SunburstSeriesOption> {
             ? (this._viewRoot = viewRoot)
             : (viewRoot = this._viewRoot);
 
-        let root = this.getRawData().tree.root;
+        const root = this.getRawData().tree.root;
 
         if (!viewRoot
             || (viewRoot !== root && !root.contains(viewRoot))
diff --git a/src/chart/sunburst/SunburstView.ts b/src/chart/sunburst/SunburstView.ts
index c804170..b5ce867 100644
--- a/src/chart/sunburst/SunburstView.ts
+++ b/src/chart/sunburst/SunburstView.ts
@@ -53,33 +53,33 @@ class SunburstView extends ChartView {
         // @ts-ignore
         payload
     ) {
-        let self = this;
+        const self = this;
 
         this.seriesModel = seriesModel;
         this.api = api;
         this.ecModel = ecModel;
 
-        let data = seriesModel.getData();
-        let virtualRoot = data.tree.root as DrawTreeNode;
+        const data = seriesModel.getData();
+        const virtualRoot = data.tree.root as DrawTreeNode;
 
-        let newRoot = seriesModel.getViewRoot() as DrawTreeNode;
+        const newRoot = seriesModel.getViewRoot() as DrawTreeNode;
 
... 24927 lines suppressed ...


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org