3Dプログラミング講座・その18:CSVファイル処理オマケでjavascriptによる関数ポインタの実装方法


実際の使用例

太陽系惑星軌道計算シミュレーターフォーム by javascript

占星術

占星術.zip


horoscope.htm


var BirthPlace = [
['アディスアベバ エチオピア', 9.022736, 38.746799], 
['アテネ ギリシャ共和国', 37.973620, 23.718989], 
['アビジャン コートジボワール', 5.336318, -4.027751], 
['アレキサンドリア エジプト', 31.228000, 29.957718], 
['アンマン ヨルダン', 31.949381, 35.932911], 
['イスタンブール トルコ共和国', 41.065960, 29.006069], 
['ウィーン オーストリア', 48.201841, 16.364571], 
['ウラジオストック ロシア連邦', 43.125469, 131.886398], 
['ウランバートル モンゴル国', 47.921378, 106.905540], 
['エルサレム イスラエル', 31.773750, 35.225220],
['オークランド ニュージーランド', -36.904148, 174.760498], 
['大阪 日本', 34.4112, 135.2946],
['オタワ カナダ', 45.411572, -75.698194], 
['カイロ エジプト', 30.064742, 31.249509], 
['カサブランカ モロッコ', 33.605381, -7.631949], 
['カブール アフガニスタン', 34.528455, 69.171703], 
['カラカス ベネズエラ・ボリバル共和国', 10.491016, -66.902061],
['キエフ ウクライナ', 50.453629, 30.503828], 
['キンシャサ コンゴ民主共和国', -4.320836, 15.298660], 
['グアテマラシティ グアテマラ', 14.624795, -90.532818], 
['クアラルンプール マレーシア', 3.150210, 101.707703], 
['クウェート クウェート国', 29.329404, 48.003930], 
['クライストチャーチ ニュージーランド', -43.523529, 172.638199], 
['ケープタウン 南アフリカ共和国', -33.924788, 18.429916], 
['コペンハーゲン デンマーク王国', 55.692829, 12.554125], 
['コルカタ インド', 22.543539, 88.334221], 
['コロンボ スリランカ', 6.927468, 79.848358], 
['サラエボ ボスニア・ヘルツェゴビナ連邦', 43.856430, 18.413420], 
['サンタフェデボゴタ コロンビア', 4.609866, -74.082050], 
['サンパウロ ブラジル', -23.581301, -46.622898],
['サンプトペテルブルグロシア連邦', 59.951889, 30.453329], 
['サンフランシスコ アメリカ合衆国', 37.775000, -122.418330], 
['サンホセ コスタリカ', 9.927128, -84.082012], 
['シアトル アメリカ合衆国', 47.606390, -122.330830], 
['シカゴ アメリカ合衆国', 41.850000, -87.650000], 
['シドニー オーストラリア', -33.891576, 151.241709], 
['ジブチ ジブチ共和国', 11.588599, 43.145850], 
['ジャカルタ インドネシア', -6.211544, 106.845172], 
['上海 中華人民共和国', 31.247869, 121.472702], 
['シンガポール シンガポール', 1.298828, 103.824898], 
['スコピエ マケドニア共和国', 42.003812, 21.452246], 
['ストックホルム スウェーデン', 59.286948, 18.072977], 
['ソウル 韓国', 37.532308, 126.957440], 
['ソフィア ブルガリア', 42.710543, 23.323827], 
['台北 台湾', 25.035089, 121.506699], 
['ダカール セネガル', 14.686680, -17.451920], 
['タシケント ウズベキスタン', 41.305229, 69.268967], 
['ダッカ バングラデシュ', 23.709921, 90.407143], 
['ダブリン アイルランド共和国', 53.341560, -6.257347], 
['ダマスカス シリア・アラブ共和国', 33.519299, 36.313450], 
['チュニス チュニジア共和国', 36.818810, 10.165960], 
['テヘラン イラン', 35.696216, 51.422945], 
['東京 日本', 35.41, 139.45],
['ドゥシャンベ タジキスタン', 38.565356, 68.775835], 
['ドバイ アラブ首長国連邦', 25.281892, 51.517541], 
['トビリシ グルジア', 41.709981, 44.792998], 
['トリポリ リビア', 32.876174, 13.187507], 
['ナイロビ ケニア共和国', -1.274359, 36.813106], 
['ニューデリー インド', 28.637690, 77.205824], 
['ニューヨーク アメリカ合衆国', 40.714170, -74.006390], 
['パース オーストラリア', -31.932854, 115.861940], 
['バグダッド イラク共和国', 33.332480, 44.418399], 
['パナマ パナマ共和国', 8.994269, -79.518792], 
['ハノイ ベトナム', 21.024250, 105.854694], 
['ハバナ キューバ', 23.116800, -82.388557], 
['パリ フランス', 48.852840, 2.349857], 
['バルセロナ スペイン', 41.384855, 2.172164], 
['バンクーバー カナダ', 49.242609, -123.099399], 
['バンコク タイ王国', 13.730780, 100.521004], 
['ビサウ ギニア・ビザウ共和国', 11.863980, -15.598210], 
['ビシュケク キルギス共和国', 42.870022, 74.587883], 
['平壌 北朝鮮', 39.031859, 125.753765], 
['ブエノスアイレス アルゼンチン', -34.611781, -58.417309],
['ブカレスト ルーマニア', 44.430481, 26.122980], 
['釜山 韓国', 35.157871, 129.054703], 
['ブダペスト ハンガリー', 47.490812, 19.080970], 
['プノンペン カンボジア', 11.558831, 104.917445], 
['ブラザビル コンゴ共和国', -4.280772, 15.283650], 
['プラハ チェコ共和国', 50.078816, 14.437635], 
['プリマス イングランド', 50.378535, -4.139914], 
['ブリュッセル ベルギー', 50.837051, 4.367612], 
['ベオグラード セルビア', 44.802416, 20.465601], 
['北京 中華人民共和国', 39.904491, 116.391468], 
['ヘルシンキ フィンランド共和国', 60.160791, 24.952548], 
['ベルリン ドイツ連邦共和国', 52.524268, 13.406290], 
['ホーチミン(旧名サイゴン) ベトナム', 10.759180, 106.662498], 
['香港 中華人民共和国', 22.278381, 114.174287], 
['マドリード スペイン', 40.422319, -3.704289], 
['マニラ フィリピン', 14.600657, 120.982150], 
['マルセイユ フランス', 43.291413, 5.375633], 
['ミュンヘン ドイツ', 48.139743, 11.560050], 
['ミラノ イタリア', 45.471156, 9.185727], 
['メキシコシティ メキシコ', 19.410636, -99.130588], 
['メルボルン オーストラリア', -37.809575, 144.965186], 
['モスクワ ロシア連邦', 55.746455, 37.631895], 
['モナコ モナコ公国', 43.739190, 7.427498], 
['モンテビデオ ウルグアイ', -34.8939, -56.15684],
['ヤンゴン ミャンマー連邦', 16.783656, 96.156831], 
['ラパス ボリビア', -16.49901, -68.146248],
['リオデジャネイロ ブラジル', -22.90937, -43.214998],
['リスボン ポルトガル', 38.727486, -9.148677], 
['リマ ペルー共和国', -12.093084, -77.046491],
['リヤド サウジアラビア', 24.640151, 46.724893], 
['ルアンダ アンゴラ共和国', -8.813513, 13.237476], 
['ローマ イタリア', 41.899344, 12.493110], 
['ロサンゼルス アメリカ合衆国', 34.052220, -118.242780], 
['ロンドン イギリス', 51.508967, -0.126127], 
['ワシントン アメリカ合衆国', 38.894561, -77.009571], 
['ワルシャワ ポーランド', 52.244949, 21.011881], 
['ンジャメナ チャド', 12.104797, 15.044506]]; 


var imgstr =['', 'sun.png','moon.png','mercury.png','venus.png','mars.png','jupiter.png','saturn.png','uranus.png','neptune.png',
               'pluto.png','ceres.png','pallas.png','juno.png','vesta.png','chiron.png','lilith.png','dragonhead.png','dragontail.png','asc.png','mc.png',
               'aries.png','taurus.png','gemini.png','cancer.png','leo.png','virgo.png',
               'libra.png','scorpio.png','sagittarius.png','capricorn.png','aquarius.png','pisces.png',
                'conjunction.png','sextile.png','square.png','trine.png','opposition.png',
                'semisextile.png','semisquare.png','quintile.png','biquintile.png','quincunx.png','sesquiquadrate.png','parallel.png'];






var TMan = new N6LTimerMan();  //タイマーマネージャー
var width = 540;
var height = 1440;
var planetnum = 32;



var dres;
var log = [0,0];
var img = [];

var bBBB;
var bRunning = false;
var bWaiting = false;
var Speed = 1.0;
var CCLWay = 0;
var fFst = 1;
var dat;
var time;
var dt;
var imgRead = 1;
var bRead = false;
var bLAM = false;
var intvl = 50;

var CNST_AU = 1.49597870700e+11;

var planet = [new Array(), new Array()];


function enter() {

  createOption(0);
  createOption(1);

  onNOW();
  onOO();
  init(0);

  TMan.add();
  Loop(0);  //初回実行

}

function Loop(id) {
  if(bWaiting || 0 < fFst) onWaiting();
  if(bRunning) onRunning();
  TMan.timer[id].setalerm(function() { Loop(id); }, intvl);  //メインループ再セット
}

function onNOW() {
  var dt = new Date();
  setday(dt);
  onSTP();
}

function onOO() {
  T41.value = 0;
  T51.value = 0;
  T61.value = 0;
  onSTP();
}

function onSTP() {
  bRunning = false;
  init(0);
}

function onREV() {
  init(-1);
}

function onRUN() {
  init(1);
}

function setday(dt) {
  var year = dt.getFullYear();
  var month = dt.getMonth() + 1;
  var day = dt.getDate();
  var hour = dt.getHours();
  var minute = dt.getMinutes();
  var second = dt.getSeconds();
  T11.value = year;
  T21.value = month;
  T31.value = day;
  T41.value = hour;
  T51.value = minute;
  T61.value = second;
}

function createOption(n){
 var elm = document.getElementById('BP' + n);
  for(var i = 0; i < 109; i++){
    var option = document.createElement('option');
    option.value = "BPOPT"+ n + '_' + i;
    option.textContent = BirthPlace[i][0];
    elm.appendChild(option);
  }
  elm.value = "BPOPT"+ n + "_52";
  chgbp(n);
}

function chgbp(n){
  var elm = document.getElementById('BP' + n);
  var num = Number(elm.value.substr(7));
  elm = document.getElementById('TN' + n);
  elm.value = BirthPlace[num][1];
  elm = document.getElementById('TE' + n);
  elm.value = BirthPlace[num][2];
  log[n] = BirthPlace[num][2];
}

function init(b) {
  bBBB = b;
  if(0 <= b) Speed = Number(SPD.value);
  else Speed = Number(SPD.value) * -1;

  var radioList = document.getElementsByName("CCL");
  for(i = 0; i<radioList.length; i++){
      if(radioList[i].checked){
          CCLWay = Number(radioList[i].value);
          break;
      }
  }

  for(i = 1; i < imgstr.length; i++){
    img[i] = new Image();
    img[i].src = "./img/horoscope/" + imgstr[i];
    img[i].onload = function(){
      imgRead++;
    }
  }

  bWaiting = false;
  InitKepler();
  onWaiting();
}

function onWaiting() {
  if(!bWaiting) {
    fFst = -1;
    if(bBBB) bRunning = true;
  }
//  dispplnt();
}

function onRunning() {
  var msecPerMinute = 1000 * 60;
  var msecPerHour = msecPerMinute * 60;
  var msecPerDay = msecPerHour * 24;

  if(fFst != 0) {
    fFst = 0;
    time = 0.0;
    dt = Speed * msecPerDay;
  }
 
  //メインループ
  UpdateFrameKepler();
}

function InitKepler() {
  if(!bRead) fFst = 1;
  dat = new Date();
  PlanetInit(dat);
}

function UpdateFrameKepler() {
  var msecPerMinute = 1000 * 60;
  var msecPerHour = msecPerMinute * 60;
  var msecPerDay = msecPerHour * 24;

  var dat1;
  var day = time / msecPerDay;
  var tm = dt;
  if(dt != 0.0) {
    time = time + tm;
    var datt = dat.getTime();
    var dat1t = datt + time;
    var dat1 = new Date(dat1t);

    PlanetInit(dat1);    //新しい日時で惑星初期化

    dispplnt();
    setday(dat1);
  }
}


//惑星初期化
function PlanetInit(dat) {
  var msecPerMinute = 1000 * 60;
  var msecPerHour = msecPerMinute * 60;
  var msecPerDay = msecPerHour * 24;
  var Add = [log[0] / 180.0, log[1] / 180.0];
  var i;
  var j;
  if(0 < fFst) {
    //データファイル読み込み
    if(!bWaiting) {
      bWaiting = true;
      readCSV('./javascripts/nas6lib/PData001.txt', 'analyzeCSV', 'readedCSV');
    }
    return;
  }
  else {


    if(imgRead < imgstr.length){
      setTimeout(function(){ PlanetInit(dat); }, 500);
      return;
    }




    for(var i = 0; i < planetnum; i++) {

      var PlanetName = dres[i][0];
      var PlanetNo = Number(dres[i][1]);
      var EpochYY = Number(dres[i][2]);
      var EpochMM = Number(dres[i][3]);
      var EpochDD = Number(dres[i][4]);
      var Epochh = Number(dres[i][5]);
      var Epochm = Number(dres[i][6]);
      var Epochs = Number(dres[i][7]);
      var a = Number(dres[i][8]);
      var e = Number(dres[i][9]);
      var m0 = Number(dres[i][10]);
      var npd = Number(dres[i][11]);
      var ra = Number(dres[i][12]);
      var rb = Number(dres[i][13]);
      var p = Number(dres[i][14]);
      var ss = Number(dres[i][15]);
      var ii = Number(dres[i][16]);
      var ww = Number(dres[i][17]);
      var m = Number(dres[i][18]);
      var r = Number(dres[i][19]);
      var mv = Number(dres[i][20]);

      var dat0 = new Date(EpochYY, EpochMM - 1, EpochDD, Epochh, Epochm, Epochs);
      var datt = dat.getTime();
      var dat0t = dat0.getTime();

      var ddat;

      for (var j = 0; j < 2; j++){

        if(j == 0){
          var dat000 = new Date(T10.value,T20.value-1,T30.value,T40.value,T50.value,T60.value);
          var datt000 = dat000.getTime();
          ddat = (datt000 - dat0t) / msecPerDay - Add[j];
        }
        else {
          ddat = (datt - dat0t) / msecPerDay - Add[j];
        }

        //惑星初期化
        planet[j][i] = new N6LPlanet();
        if(i == 0){
          planet[j][i].CreateEarth(PlanetNo, PlanetName, ddat, dat0, a, e, m0, npd, ra, rb, p, ss, ii, ww, m, r);
        }
        else if(i == 2){
          planet[j][i].CreateMoon(PlanetNo, PlanetName, ddat, dat0, Add[j], planet[j][0], true);
        }
        else if(i < 16){
          planet[j][i].CreatePlanet(PlanetNo, PlanetName, ddat, dat0, a, e, m0, npd, ra, rb, p, ss, ii, ww, m, r, planet[j][0]);
        }
        else if(i < 21){
//          planet[j][i].CreateConfig(PlanetNo, PlanetName, ddat, dat0, i - 16, planet[j][0]);
        }
        else{
//          planet[j][i].CreateEtc(PlanetNo, PlanetName, ddat, dat0, m0, planet[j][0]);
        }
      }
    }
    planet[0][0].asc(dat);
    planet[0][0].house(planet[0][0].m_asc);
    dispplnt();
  }
}

function readedCSV(res) {
  var msecPerMinute = 1000 * 60;
  var msecPerHour = msecPerMinute * 60;
  var msecPerDay = msecPerHour * 24;
  bWaiting = false;
  bRead = true;
  fFst = -1;
  dres = res;
  PlanetInit(dat);
  return true;
}


function dispplnt() {
  var msecPerMinute = 1000 * 60;
  var msecPerHour = msecPerMinute * 60;
  var msecPerDay = msecPerHour * 24;

 var canvas = document.getElementById('cnv0');
 if (canvas.getContext) {
  var context = canvas.getContext('2d');
  context.fillStyle = 'rgb(255,255,255)';
  context.fillRect(0,0,width,height);

  context.strokeStyle = 'rgb(0,0,0)'; 
  context.lineWidth = 3;
  context.beginPath();
  context.arc(width / 2, width / 2, 260, 0, Math.PI*2, false);
  context.stroke();


  var vecWK = new N6LVector([1, 0]);
  var nasc = -planet[0][0].m_asc * Math.PI / 180.0;
  var nlog = log * Math.PI / 180.0;
  var datt = dat.getTime();
  var days = Math.floor(datt / msecPerDay);
  var dayt = (datt / msecPerDay) - days;
  var dayth = dayt * Math.PI * 2;
  var i;
  for(i = 1; i <16 ; i++){

    var nel = planet[1][i].m_el * Math.PI / 180.0;

    vecWK = new N6LVector([1, 0]);
    vecWK = vecWK.Rot2D(nel);
//    vecWK = vecWK.Rot2D(dayth);
//    vecWK = vecWK.Rot2D(nasc);
//    vecWK = vecWK.Rot2D(nlog);

      context.drawImage(img[i], -vecWK.x[0] * 250 + width / 2 - 16, vecWK.x[1] * 250 + width / 2 - 16, 32, 32);
  }
 }
}




NAS6LIBを用います
NAS6LIB

ヘッダーに入れるもの
<script src="./javascripts/nas6/common.js"></script>

readCSVの実装はこんな感じです


//read CSV //CSV読み込み
function readCSV(filename,analyzefunc,donefunc){
  var afunc = new Function("param", "return " + analyzefunc + "(param)");   
  var dfunc = new Function("param", "return " + donefunc + "(param)");   
  var httpObj = new XMLHttpRequest();
  res = "";
  httpObj.open("GET", filename, true);
  httpObj.onreadystatechange = function() {
    if (httpObj.readyState == 4) {
      if(httpObj.status == 0){
        alert("Error:connect");
      }
      else if((200 <= httpObj.status && httpObj.status < 300) || (httpObj.status == 304)) {
        res = httpObj.responseText;
        res = afunc(res);
        dfunc(res);
        return res;
      }
      else {
        alert("Error:others");
      }
    }
  }
  httpObj.send(null);
  return true;
}

//analyze CSV //CSV解析
function analyzeCSV(res) {
  var ares = new Array();
  var line;
  if (res.match(/\r/))     line = res.split("\r\n");
  else                     line = res.split("\n");

  var linenum = line.length;
  for (var i = 0; i < linenum; i++) ares[i] = new Array();
  var k = 0;
  var maxcol = 0;
  for (i = 0; i < linenum; i++) {
    if(line[i][0] == '#') {k++; continue;} //skip comment out//コメントアウトはスキップ
    line[i] = line[i].replace( /\t/g,"");
    line[i] = line[i].replace( /\s/g,"");
    var col = line[i].split(",");
    var colnum = col.length;
    for (var j = 0; j < colnum; j++) ares[i - k][j] = col[j];
    if (colnum > maxcol) maxcol = colnum;
  }
  ares.length = linenum - k;
  return ares;
}

//ex//使用例:readCSV('filename', 'analyzeCSV', 'donefunc');


readCSV('filename', 'analyzeCSV', 'donefunc');を叩いて
analyzeCSVでデータ解析をして
donefuncに読み込み完了の処理をさせます

analyzeCSVは
1行ずつの解析で
行ごとの1文字目の#はコメント行
タブとかスペースを削除して,カンマで区切って単語取得
そういったリストを返しています

donefuncは動作毎の実装で例えばhoroscope.htmの実装はreadedCSVとなっています


function readedCSV(res) {
  var msecPerMinute = 1000 * 60;
  var msecPerHour = msecPerMinute * 60;
  var msecPerDay = msecPerHour * 24;
  bWaiting = false;
  bRead = true;
  fFst = -1;
  dres = res;
  PlanetInit(dat);
  return true;
}


dres = res;
のdresはグロバールスコープで生データを保存しておきます
PlanetInitでdresのデータを使用してます

//ex//使用例:readCSV('filename', 'analyzeCSV', 'donefunc');
こうやって叩いてdonefuncを記述すればいいです
その気になればCSVインタプリタとかもできるよ


//惑星初期化
function PlanetInit(dat) {
  var msecPerMinute = 1000 * 60;
  var msecPerHour = msecPerMinute * 60;
  var msecPerDay = msecPerHour * 24;
  var Add = [log[0] / 180.0, log[1] / 180.0];
  var i;
  var j;
  if(0 < fFst) {
    //データファイル読み込み
    if(!bWaiting) {
      bWaiting = true;
      readCSV('./javascripts/nas6lib/PData001.txt', 'analyzeCSV', 'readedCSV');
    }
    return;
  }
  else {


    if(imgRead < imgstr.length){
      setTimeout(function(){ PlanetInit(dat); }, 500);
      return;
    }




    for(var i = 0; i < planetnum; i++) {

      var PlanetName = dres[i][0];
      var PlanetNo = Number(dres[i][1]);
      var EpochYY = Number(dres[i][2]);
      var EpochMM = Number(dres[i][3]);
      var EpochDD = Number(dres[i][4]);
      var Epochh = Number(dres[i][5]);
      var Epochm = Number(dres[i][6]);
      var Epochs = Number(dres[i][7]);
      var a = Number(dres[i][8]);
      var e = Number(dres[i][9]);
      var m0 = Number(dres[i][10]);
      var npd = Number(dres[i][11]);
      var ra = Number(dres[i][12]);
      var rb = Number(dres[i][13]);
      var p = Number(dres[i][14]);
      var ss = Number(dres[i][15]);
      var ii = Number(dres[i][16]);
      var ww = Number(dres[i][17]);
      var m = Number(dres[i][18]);
      var r = Number(dres[i][19]);
      var mv = Number(dres[i][20]);

      var dat0 = new Date(EpochYY, EpochMM - 1, EpochDD, Epochh, Epochm, Epochs);
      var datt = dat.getTime();
      var dat0t = dat0.getTime();

      var ddat;

      for (var j = 0; j < 2; j++){

        if(j == 0){
          var dat000 = new Date(T10.value,T20.value-1,T30.value,T40.value,T50.value,T60.value);
          var datt000 = dat000.getTime();
          ddat = (datt000 - dat0t) / msecPerDay - Add[j];
        }
        else {
          ddat = (datt - dat0t) / msecPerDay - Add[j];
        }

        //惑星初期化
        planet[j][i] = new N6LPlanet();
        if(i == 0){
          planet[j][i].CreateEarth(PlanetNo, PlanetName, ddat, dat0, a, e, m0, npd, ra, rb, p, ss, ii, ww, m, r);
        }
        else if(i == 2){
          planet[j][i].CreateMoon(PlanetNo, PlanetName, ddat, dat0, Add[j], planet[j][0], true);
        }
        else if(i < 16){
          planet[j][i].CreatePlanet(PlanetNo, PlanetName, ddat, dat0, a, e, m0, npd, ra, rb, p, ss, ii, ww, m, r, planet[j][0]);
        }
        else if(i < 21){
//          planet[j][i].CreateConfig(PlanetNo, PlanetName, ddat, dat0, i - 16, planet[j][0]);
        }
        else{
//          planet[j][i].CreateEtc(PlanetNo, PlanetName, ddat, dat0, m0, planet[j][0]);
        }
      }
    }
    planet[0][0].asc(dat);
    planet[0][0].house(planet[0][0].m_asc);
    dispplnt();
  }
}



生データの使い方はこんな風に行と列で単語がリスト化されているのでそれを使えばいいです
var PlanetName = dres[i][0];
var PlanetNo = Number(dres[i][1]);
...


あ、多分これがわけわかめだと思うけど
関数内から呼び出す関数の渡し方は
呼び出す関数名の文字列を渡して
関数内で
var afunc = new Function("param", "return " + analyzefunc + "(param)");
こう登録して
呼び出し箇所で
afunc(param);
ってするん
よくよく考えてみてね
C言語で言う関数ポインタをjavascriptで書くとこうなるん
setimeout()とか関数内部で別の関数を呼ぶやり方はたぶんこうやっているん
要するにbutton.addEventListener('click', butotnClick);
これの実装方法ということです
javascriptで関数ポインタなんて
もちろんプロシージャ型のインスタンスをとるnew Functionなん

function hoge(hage){
  alert("enter hoge();");

  var hagefunc = new Function("param", "return " + hage + "(param)");
  var param = 12345;
  hagefunc(param); 

  alert("exit hoge();");
}

function moo(par){
  alert("called moo();");
}

hoge('moo');


試しにこれを実行すると面白いし
これが出来たらjavascriptで出来ることがかなり広がるん


var hagefunc = new Function("param", "return " + hage + "(param)");
これを翻訳するともちろん
var hagefunc = function(param) {return moo(param);}
になるん


var hagefunc = new Function("param", "return " + hage + "(param)");
一見めちゃくちゃな記述だと思うけれど
実はとても正しい記述なんですよ
こういうことなんですもん
var hagefunc = function(param) {return moo(param);}
なんてこともなくてプロシージャ型のインスタンスを取っただけです
つまりプロシージャ型をコンストラクタで構築しただけ

MDN-Function



var x = 10;

function createFunction1() {
    var x = 20;
    return new Function('return x;'); // この |x| はグローバルの |x| を表す
}

function createFunction2() {
    var x = 20;
    function f() {
        return x; // この |x| は上記のローカルの |x| を表す
    }
    return f;
}

//################################
//おらの補足
//################################

function callFunction3(cal){
    alert("enter callFunction3(cal)");
    var afunc = new Function("param","return " + cal + "(param);"); 
    var x = 30;
    x = afunc(x);
    alert("exit callFunction3(cal)");
    return x;  // この |x| はローカルの |x| を表す
}

function fnc(x){
  alert("called fnc(x); x : " + x);
  return x;
}


function test(){

  var f1 = createFunction1();
  alert(f1());          // 10
  var f2 = createFunction2();
  alert(f2());          // 20
  alert(callFunction3('fnc'));            // 30
}




var afunc = new Function("param","return " + cal + "(param);");
多分これは無名関数
var afunc = function(param){return " + cal + "(param);"};
に翻訳されているのでcreateFunction2のケースのローカルの|x|を指します





3Dプログラミング入門講座
NAS6LIB
ポリゴンテスト解説・x3dom使い方
その1:ベクトル
その2:行列
その3:クォータニオン
その4:基本総復習・実践
その5:応用その1・メッシュアニメーション、動的テクスチャ
その6:応用その2・GLSL、カスタムシェーダー、キーボード、ファイル
その7:応用その3・ゲームプログラミング、タグの動的追加
その8:応用その4・GLSL、シェーダー、その2
その9:物理演算その1・電卓で相対性理論を解く方法
その10:物理演算その2・相対性理論的ニュートン力学
その11:物理演算その3・ケプラー方程式で惑星軌道シミュレーターを作る
その12:物理演算その4・ルンゲクッタ法で作った 相対性理論的ニュートン力学物理エンジンで惑星軌道シミュレーターを作る
その13:経路探索(A*:A-STAR)&巡回セールスマン問題 : 巨大サイズ : くろにゃんこ
その14:プログラミングにおける配列テーブルテクニック
その15:javascriptのクラス活用法
その16:透視射影公式テスト
その17:ケプラー方程式カプセルライブラリ使用法
その18:CSVファイル処理
その19:物理演算その5・重力多体問題
その20:同次座標について(3D座標系の基本の基本)


 ■■■ THREE.JSプログラミング講座 ■■■ 
THREE.JSテスト解説・THREE.JS使い方
THREE.JS examplesをいじってみた(フレネル反射透過シェーダー)
THREE.JS (半透明シェーダー)
THREE.JS 3D演算で必要な計算(具体例)★とても重要★
THREE.JS THREE-VRM をいじってみた


ケプラー方程式カプセルライブラリ使用法 << : 重力多体問題 >>





戻る