为什么可以';我在Javascript中是否在相同的函数范围内使用变量?

为什么可以';我在Javascript中是否在相同的函数范围内使用变量?,javascript,scope,legend,chart.js,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 = [ {

我正在尝试在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();
                }
}
然而,当我取消legendTemplate内容的注释时,我得到了一个未捕获的数据引用错误。我认为这是某种范围错误

Javascript范围让我困惑不已,因为我来自C/C++/Python背景,而且它令人恼火地违反直觉。对我来说,“数据”的范围与“选项”的范围相同,因此“选项”应该能够看到“数据”,但情况显然并非如此。我到底做错了什么

最终,我真正想要实现的是删除图例上令人讨厌的项目符号(我上面编写的当前代码无法实现这一点),但我想了解,在这个过程中,我的一个小错误是什么,它阻止我在同一级别的选项变量中看到数据变量(两者都在同一个函数中)


在不输入函数的情况下使用括号是否会改变作用域?如果是,方括号对作用域的影响是否与弯曲括号不同?

在循环中尝试数据[i]改为.value。数据在代码中是一个数组,但您尝试引用它,好像它有一个属性,因为它是一个对象数组。您还需要i
实际上,这里的错误比我最初看到的要多,因为字符串文字是奇怪的,尽管这可能是一个粘贴错误?

注释掉部分中的
data
只是JavaScript字符串文字的一部分,根本不是变量。它不应该抛出引用错误。
我注意到您正在访问
data.value,而不是
数据[i].value
。既然
数据
是一个数组,你不应该通过索引访问它吗?@Quentin Chart.js使用John Resig的微模板代码。这里的想法是基于图表每个部分的数据生成标签。Chart.js donut Chart代码创建标签,以便元素上有类名。你可以只需添加一些CSS规则,将它生成的
设置为
列表样式:无;
@啮齿动物,就可以得到你想要的东西。虽然没有真正的文档记录,但我认为甜甜圈图表的模板上下文是图表对象本身。当然,不是确切的上下文;模板被解释为带有
状态的
中的代码t、 而
with
语句引用的是图表对象。因此,在默认标签模板中,
name
是字符串“Doughnut”而
segments
是图表数据的数组。
是用类
甜甜圈图例生成的。这都是关于chart.js的一个特性;它与范围无关(好吧,反正也不多)。@Pointy啊,我知道我出错了。我对这方面不熟悉,我认为它一开始是比较普通的代码。
<div class="graph">
                            <canvas id="dgraph" width="300" height="200"></canvas>                            
                            <div id="js-legend" class="chart-legend"></div>
                        </div>
.chart-legend li span{
    display: inline-block;
    width: 12px;
    height: 12px;
    margin-right: 5px;
}

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