为什么我不能在Javascript中使用相同函数范围的变量?

时间:2016-01-04 14:40:59

标签: javascript scope legend chart.js

我正在尝试在Chart.js中使用legendTemplate。

我有这个:

var item1 = 5;
var item2 = 10;

function handle_chart_data(data) {
                window.item1 = data[0];
                window.item2 = data[1];

                var data = [
                {
                    value : window.item1,
                    color : "#FF0000",
                    label : "Item1"
                },
                {
                    value : window.item2,
                    color : "#5E5E5E",
                    label : "Item2"
                },
                ];

                options = {
                    segmentShowStroke: false,
                    animateRotate: true,
                    animateScale: false,
                    percentageInnerCutout: 50,
                    //legendTemplate: "<% for (var i=0; i<5; i++ ) { data.value } %>"
                }

                var ctx = document.getElementById("dgraph").getContext("2d");
                var myChart = new Chart(ctx).Doughnut(data, options);
                document.getElementById('js-legend').innerHTML = myChart.generateLegend();
                }
}

HTML就是这样:

<div class="graph">
                            <canvas id="dgraph" width="300" height="200"></canvas>                            
                            <div id="js-legend" class="chart-legend"></div>
                        </div>

CSS如下:

.chart-legend li span{
    display: inline-block;
    width: 12px;
    height: 12px;
    margin-right: 5px;
}

.graph {
    float:left;
    width: 100%; 
    height: 100%;
}

但是,当我取消注释legendTemplate的内容时,我得到了一个未被捕获的数据引用错误。我认为这是一种范围错误。

Javascript范围让我感到困惑,因为我来自C / C ++ / Python背景,而且它非常反直觉。对我来说,“数据”的范围与“选项”的范围相同,因此“选项”应该能够看到“数据”,但事实并非如此。到底是我做错了什么?

最终,我真正想要实现的是删除我的传奇上的烦人子弹(我上面的代码如上所述不会实现这一点)但我想了解在我的部分中出现的一个微不足道的错误。进程阻止我在同一级别的两个选项变量中看到数据变量(都在同一个函数内)。

使用括号而不输入功能更改范围?如果方括号与方格括号相比,方括号对范围有不同的影响吗?

1 个答案:

答案 0 :(得分:-1)

在循环中尝试数据[i] .value。数据是代码中的数组,但是您尝试引用它就好像它没有属性,因为它是一个对象数组。你也想要我&lt; data.length或者你会得到更多例外。

实际上比我最初看到的错误要多得多,因为字符串文字很奇怪,尽管这可能是粘贴错误?