2014-07-07 4 views
0

익명 함수에서 전역 변수를 사용하는 프로그램이 있습니다. 함수가 끝나기 전에 변수를 출력해도 값은 있지만 함수 뒤에는 변수가 없습니다. 이것은 내 코드이며, 전역 변수는 "Mytree"이며, 이것은 CSV 파일의 구문 분석 프로그램입니다. 마지막 2 장을보세요. 내 질문은 : 내 변수의 값이 저장되지 않는 이유와 저장하는 방법입니다.전역 변수 JavaScript

// My program : 
var Mytree = {}; // My global variable. 
d3.csv("data.csv", function (data) { // The anonymous function to parse the csv file 

    /* -- Parsing du csv -- */ 
    var dataTab = []; 
    var j = 0; 
    var exigence = ""; 
    var root = "Systeme"; 

    for (var i = 0; i < data.length; i++) { 
     if (data[i].Contrat !== "") { 
      if (data[i].ExigenceContractuelle.split(".").length !== 1) { 
       exigence = data[i].ExigenceContractuelle.split(".")[0]; 
       if (exigence.split("_").length !== 1) { 
        exigence = exigence.split("_")[0]; 
       } 
      } else if (data[i].ExigenceContractuelle.split("-").length !== 1) { 
       exigence = data[i].ExigenceContractuelle.split("-")[0]; 
      } else if (data[i].ExigenceContractuelle.split("_").lenght !== 1) { 
       exigence = data[i].ExigenceContractuelle.split("_")[0]; 
      } else { 
       exigence = data[i].ExigenceContractuelle.split(".")[0]; 
      } 

      dataTab[j] = { 
       name: data[i].ExigenceSystème, 
       textExig: data[i].TexteExigence, 
       validation: data[i].Validation, 
       discution: data[i].Discution, 
       SSSExig: data[i].LibelleTexte, 
       team: root + "/" + exigence + "/" + data[i].ExigenceContractuelle 
      }; 
      j++; 
     } 
    } 
    /* -- -- */ 


    /* -- Tableau -> Json Tree -- */ 

    function fillTree(name, textExigTmp, SSSExigTmp, validation, discution, steps) { 
     var current = null, 
      existing = null, 
      i = 0; 
     for (var y = 0; y < steps.length; y++) { 
      if (y === 0) { 
       if (!Mytree.children || typeof Mytree.children === 'undefined') { 
        Mytree = { 
         text: steps[y], 
         textExig: textExigTmp, 
         SSSExig: SSSExigTmp, 
         leaf: false, 
         children: [], 
         open: false, 
         discution: discution == "" ? 0 : discution, 
         validation: validation == 1 ? true : false 
        }; 
       } 
       current = Mytree.children; 
      } else { 
       existing = null; 
       for (i = 0; i < current.length; i++) { 
        if (current[i].text === steps[y]) { 
         existing = current[i]; 
         break; 
        } 
       } 
       if (existing) { 
        current = existing.children; 
       } else { 
        current.push({ 
         text: steps[y], 
         textExig: textExigTmp, 
         SSSExig: SSSExigTmp, 
         leaf: false, 
         children: [], 
         open: false, 
         discution: discution == "" ? 0 : discution, 
         validation: validation == 1 ? true : false 
        }); 
        current = current[current.length - 1].children; 
       } 
      } 
     } 
     current.push({ 
      text: name, 
      textExig: textExigTmp, 
      SSSExig: SSSExigTmp, 
      leaf: true, 
      open: false, 
      discution: discution == "" ? 0 : discution, 
      validation: validation == 1 ? true : false 
     }); 
    } 

    for (x = 0; x < dataTab.length; x++) { 
     steps = dataTab[x].team.split('/'); 
     fillTree(dataTab[x].name, dataTab[x].textExig, dataTab[x].SSSExig, dataTab[x].validation, dataTab[x].discution, steps); 
    } 
    /* -- -- */ 
    console.log(window.Mytree); // It's ok Mytree is not empty 
}); 
console.log(window.Mytree); // Mytree = {} ... 
+2

JavaScript는 기본적으로 비동기이므로 변수가 특정 상태를 가질 것으로 기대할 수는 없습니다. 파일의 끝에. 콜백 또는 약속을 대신 사용해보십시오. – David

+0

여기 비동기 패턴 꽤 좋은 가이드입니다 자바 스크립트 (및 길들이기 방법) : http://tech.pro/blog/1402/five-patterns-to-help-you-tame-asynchronous-javascript – David

답변

0

d3.csv ("data.csv", 기능 (데이터) {-. 비동기 작업이 그래서 처음에 당신으로 myTree = {}, 및 방법을 참조하십시오이다 -. 아이들과 함께으로 myTree를

0

문제는 익명의 함수가 호출되는 시점을 알 수 없다는 것입니다. 비동기라고도 할 수 있습니다.