2016-07-26 79 views
0

我使用d3.js使數據可視化,但我不是一個JavaScript程序員,所以我寫了類似如下的的JavaScript未捕獲的參考

 for(var i =0;i<6;i++){ 
      setTimeout(function(){ 
      var in = data[0][i]; 
      slate(" + margin.left + "," + margin.top + ")"); 
      var svg = d3.select("#clustering").append("svg") 
        .attr("width", width + margin.left + margin.right) 
        .attr("height", height + margin.top + margin.bottom) 
        .append("g") 
        .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 
      svg.append("rect") 
        .attr("width", width) 
        .attr("height", height); 

      svg.append("g") 
        .attr("class", "x axis") 
        .attr("transform", "translate(0," + height + ")") 
        .call(xAxis); 

      svg.append("g") 
        .attr("class", "y axis") 
        .call(yAxis); 

      var color = d3.scale.category10(); 
      refreshGraph(); 
       },1000); 
      } 
     /* 
     * function displaying data on svg 
     * called every time data change 
     */ 
     var refreshGraph = function(){ 

      // removing all previously drawn dots 
      svg.selectAll(".dot") 
      .data(instruments) 
      .exit() 
      .remove(); 
      } 

但我得到這個錯誤Uncaught Reference Error: svg is not defined我知道功能refreshGraph看不到var svg,但我不知道如何解決此問題。 謝謝你的幫助。

+0

當你在循環中使用setTimeout時,我相信你需要使用變量將它變成匿名函數。我有類似的問題,但不是與d3 – Riddell

+2

「我知道函數refreshGraph無法看到var svg」 - 也沒有其他的。它不會出現在您分享的代碼中的任何地方。 – Quentin

+0

好吧,在這段代碼中,我沒有看到svg在任何地方定義... – beerwin

回答

3

或者:

  • 定義分配給refreshGraph函數內部的功能傳遞給setTimeout使svg仍處於範圍
  • 聲明svg循環完全是這樣它仍然在範圍內
  • 通過svg作爲參數,當你叫它