javascript和d3.js变量范围:变量在函数调用之外重置

javascript和d3.js变量范围:变量在函数调用之外重置,javascript,csv,d3.js,Javascript,Csv,D3.js,如果这是重复的话,我很抱歉,但我已经读了一些关于变量范围的帖子,我似乎无法理解这一点。非常感谢您的帮助 基本上,我只是尝试读取csv并确定它有多少行,然后将数字分配给一个全局变量。这是我的密码: <script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script> <script type="application/javascript"> var maxEpochs;

如果这是重复的话,我很抱歉,但我已经读了一些关于变量范围的帖子,我似乎无法理解这一点。非常感谢您的帮助

基本上,我只是尝试读取csv并确定它有多少行,然后将数字分配给一个全局变量。这是我的密码:

<script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script>
<script type="application/javascript">  
    var maxEpochs;

    setMaxEpochs();
    console.log(maxEpochs);

    function setMaxEpochs() {
        /*
        for (i = 0; i < 2; i++) {
            if ( document.chooseModel.model[i].checked ) {
                modelChoice = document.chooseModel.model[i].value;
                break;
            }
        }
        console.log(modelChoice);
        */


        // set initial value for maxEpochs I DON'T UNDERSTAND WHY THIS DOESN'T WORK
        d3.csv("epochStats.csv", function(d) {
            console.log(d.length);
            maxEpochs = d.length;
            console.log(maxEpochs);
        });
        console.log(maxEpochs);

    }

</script>
行号可能不太匹配(我在顶部有一些
标记等),但问题是,函数中的前两个console.log打印
100
,这是正确的编号,但一旦我离开函数,它就会恢复为
未定义的

如果您对此有任何想法,我们将不胜感激。我用它把头撞在墙上。 谢谢
Seth

这是由于javascript的异步特性造成的。您编写的代码块不会像您预期的那样“按顺序”进行计算。基本上,使用
d3.csv
调用的任何内容都必须在该块中:

d3.csv("epochStats.csv", function(d) {
        console.log(d.length);
        maxEpochs = d.length;
        console.log(maxEpochs);
        // anything else that uses the value of maxEpochs, or reads the file data, etc....
});
console.log(maxEpochs);  <-- This could be evaluated before the above csv block.
d3.csv(“epochtats.csv”,函数(d){
控制台日志(d.长度);
maxEpochs=d.长度;
console.log(maxEpochs);
//任何其他使用maxEpochs值或读取文件数据的内容,等等。。。。
});

console.log(maxEpochs);我不会结束这个问题(是的,它是重复的!),因为我为你的头撞到墙上感到抱歉!这里有一本很好的读物给你:。请把费利克斯·克林的答案读到最后,这是值得的。我明白了。那么,如果我需要在其他函数之前运行该函数(因为我需要设置
maxEpochs
并且我必须加载一个csv文件来设置它),那么最好的处理方法是什么呢?现在我只是在页面的body标记中有
onload=“setMaxEpochs();另一个函数(maxEpochs);”
,但我想这不起作用。一个选项是将所有内容都包含在d3.csv函数调用中,这在d3中似乎很常见。好吧,我想出了一个解决方案:如果调用
onload=“setMaxEpochs();setTimeout(另一个函数(maxEpochs),200);“
相反,它在尝试另一个函数之前等待的200毫秒足以让它设置
maxEpochs
变量。有人可以让我知道这是否是一个坏主意,但它似乎可以工作。感谢@tim-b指出异步性是问题所在!
d3.csv("epochStats.csv", function(d) {
        console.log(d.length);
        maxEpochs = d.length;
        console.log(maxEpochs);
        // anything else that uses the value of maxEpochs, or reads the file data, etc....
});
console.log(maxEpochs);  <-- This could be evaluated before the above csv block.