自身の関数オブジェクトを参照するには?

このQ&Aのポイント
  • 再帰呼び出しを使わずに自身の関数オブジェクトを参照する方法を探しています。
  • whileループを使用して再帰呼び出しを回避することは可能ですが、コードが複雑になる可能性があります。
  • "this"キーワードとオブジェクトを組み合わせる方法も検討しましたが、望む結果を得ることはできませんでした。
回答を見る
  • ベストアンサー

自身の関数オブジェクトを参照するには?

自身の関数オブジェクトを参照するには? 次のようなコードを書いてみました。(全角空白は半角インデントに置換してください) <p id="Target"><span><span><span><span><span><span>Hello, World!</span></span></span></span></span></span></p> <script type="text/javascript"> (function(){  function Hello(HTMLElement){   var firstChild = HTMLElement.firstChild;   var result;   switch(firstChild.nodeType){    case 1: // Element Node     result = Hello(firstChild); // 再帰呼び出し     break;    case 3: // Text Node     result = firstChild.nodeValue;     break;   }   return result;  }  var text = Hello(document.getElementById('Target'));  alert(text); // Hello, World! })(); </script> 再帰呼び出しの部分で "Hello" の文字列を使わない方法を模索しています。 # この場合、while を使えば再帰呼び出しを使わなくすることも出来ますが、実際のコードはかなり複雑で上手い方法を思いつきませんでした。 # 時間をかければ再帰呼び出しを使わないように修正することも出来るのでしょうが、今はさくっと再帰呼び出しで解決することを望んでいます。 具体的には、 result = this(firstChild); このように呼び出せるのが理想です。 (この場合のthis値は windowオブジェクト を参照するので、上記は期待通りに動作しません) this とオブジェクトを組み合わせる方法も考えましたが、肝心の "Hello" を省略できませんでした。 var obj = {}; obj.Hello = function(){ this.Hello(); }; 何か良い方法はないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • imq
  • ベストアンサー率72% (16/22)
回答No.1

Hello関数内のHelloをarguments.calleeで置き代えてください。

think49
質問者

お礼

ありがとうございます。 arguments.callee を使うことで期待通りに動作しました。 <p id="Target"><span><span><span><span><span><span>Hello, World!</span></span></span></span></span></span></p> <script type="text/javascript"> (function(){  function Hello(HTMLElement){   var firstChild = HTMLElement.firstChild;   switch(firstChild.nodeType){    case 1: // Element Node     return arguments.callee(firstChild); // 再帰呼び出し    case 3: // Text Node     return firstChild.nodeValue;   }  }  var text = Hello(document.getElementById('Target'));  alert(text); })(); </script> callee - MDC https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Functions/arguments/callee

関連するQ&A

  • クラスの中にある関数を使いたい

    次のようなクラスを使ってエレメントを作った時に、 マウスを重ねたらハイライト表示っぽくさせるために、 onmouseoverにこのクラスのメンバ関数setBackgroundColorをセットしたいのですが、 クラス内で使う時は先頭にthisが必要になると思います。 そのthisはどうやって取り出したら良いのでしょうか? それかこのやり方は間違っていて、別のやり方でやった方が良いのでしょうか? function TextObj(text) { //実体を作る var textNode = document.createTextNode(text); var spanElement = document.createElement("span"); spanElement.style.position = "absolute"; spanElement.appendChild(textNode); document.body.appendChild(spanElement); //オブジェクトへの参照を保存 this.obj = spanElement; } TextObj.prototype.setMouseOver = function() { this.obj.onmouseover = function(){ setBackgroundColor(255,255,255);←ここでこの関数を使いたい } } TextObj.prototype.setBackgroundColor = function(red, green, blue) { this.obj.style.backgroundColor = "rgb(" + red + "," + green + "," + blue + ")"; }

  • ビンゴマシン

    Java scriptとメモ帳使って作成したビンゴマシンを改良して、マシンのスタートとストップをEnterキーによる操作も出来るようにしたいと考えています。 しかしどうプログラミングしたらいいか分からず困っています。詳しい方ご教示よろしくお願い致します。 <style type="text/css"> body{ background-color: #fff; } #drum{ width: 450px; height: 450px; margin: 30px auto; position: relative; overflow: hidden; background-color: #fff; border: 2px solid #eee; border-color: #666 #eee #eee #666;} #drum span{ display: block; color: #000; font-size: 450px; height:450px; line-height: 450px; text-align: center; border-bottom: 2px groove #eee; position: relative;} div.result{ background-color: #fff; padding: 0.5em; position:relative; } #result{ width:100%; overflow:hidden; zoom:1; } #result span{ display:block; float:left; width:2.5em; text-align:center; color: #000; font-weight: bold;} #result span:last-child{ color: #f00; } </style></head> <body><div><div id="drum"></div></div> <hr><div> <input type="button" id="reset" value="reset"> <input type="button" id="switch" value="start/stop" or onClick="svset();"></div> <div class="result"> <div>◇◇ 結果 ◇◇</div> <div id="result"></div></div> <script type="text/javascript"> //********** rolling drum var DrumCreate = (function(){  var rand = function(n){ return Math.random() * n | 0; }  var shuffle = function(ary){    for(var i = ary.length - 1; i > 0; i--){     var j = rand(i + 1), tmp = ary[i];     ary[i] = ary[j], ary[j] = tmp;   } }  var add = function(elm, str, flag){   var e = document.createElement("span");   e.appendChild(document.createTextNode(str));   if(flag) elm.insertBefore(e, elm.firstChild)    else elm.appendChild(e); }  var clear = function(elm){   while(elm.firstChild) elm.removeChild(elm.firstChild); }  var init = function(obj){   if(obj.intervalId) clearInterval(obj.intervalId);   for(var i=obj.max; i; i--) obj.nums[i-1] = i;   shuffle(obj.nums);   obj.status = false;   obj.step = obj.height/(11 - obj.speed) + 0.5 | 0;   clear(obj.drum);   clear(obj.result);   add(obj.drum, "-", true); }  var setPos = function(elm, pos){   var nodes = elm.getElementsByTagName("span");   var i, node, p = -pos + "px";   for(i=0; node=nodes[i++];) node.style.top = p; }  var slide = function(obj){   var pos = obj.height, n = obj.nums.length;   if(!n){    clear(obj.drum);    add(obj.drum, "-");    obj.stop();    return;  }   obj.index = rand(n);   obj.value = obj.nums[obj.index];   add(obj.drum, obj.value, true);   setPos(obj.drum, pos);   obj.intervalId = setInterval(function(){    pos = pos>obj.step?pos-obj.step:0;    setPos(obj.drum, pos);    if(pos === 0){     clearInterval(obj.intervalId);     obj.drum.removeChild(obj.drum.lastChild);     if(obj.status) slide(obj)     else {      add(obj.result, obj.value);      obj.nums.splice(obj.index, 1);      if(typeof obj.endRoll === "function") obj.endRoll.call(obj);    }   }  }, 10); }  var drum = function(n){ this.nums = []; };  drum.prototype = {   roll: function(){    if(this.status) return;    this.status = true;    if(typeof this.beforeRoll === "function") this.beforeRoll();    slide(this);  },   stop: function(){ this.status = false; },   reset: function(){ init(this); },   beforeRoll: new Function(),   endRoll: new Function()  } return function(n , id1, id2, speed){  /* Max number, id for drum, id for result, speed(1to10) */   var obj = new drum();   obj.max = n;   obj.drum = document.getElementById(id1);   obj.result = document.getElementById(id2);   obj.height = obj.drum.clientHeight;   obj.speed = Math.max(1, Math.min(10, speed));   obj.reset();   return obj; }})(); //************ テスト用 スクリプト var testDrum = DrumCreate(75, "drum", "result", 5); /* Max number, id for drum, id for result, speed(1to10) */ addEvent("reset", "click", function(){testDrum.reset();}); addEvent("switch", "click", function(){  if(testDrum.status) testDrum.stop(); else testDrum.roll();}); /*@cc_on@*/ function addEvent(elm, eventname, func){ (typeof elm === "string"?document.getElementById(elm):elm)./*@if(1)attachEvent( 'on' + @else@*/addEventListener(/*@end@*/ eventname, func, false);}</script></body>

    • ベストアンサー
    • HTML
  • オブジェクトの番号

    お世話になります。 JavaScriptでオブジェクトプロパティを取得する。 例えば var obj=document.getElementsByTagName("*"); var len = obj.length; for (var i=0;i<len;i++){   if(obj[i].tagName.match(img)){   ・・・・・・ このときiに入る値は、そのオブジェクトの番号が入っていると思うのですが、 この番号自体のみをあるオブジェクトから取得することはできないものなのでしょうか。 具体的に <img src="・・・" onclick="getObjNo(this)"> function getObjNo(obj){  var objNo=?????  //ここで、imgオブジェクトの番号を取得したいのですが。その方法がわかりません。 } よろしくお願いいたします。

  • [JS] private関数からオブジェクト参照

    JavaScriptにて外部から使用する関数をpublicに、内部的に使用するだけの関数をprivateにしたく、 <http://d.hatena.ne.jp/brazil/20051028/1130468761>や<http://www.findxfine.com/programming/javascript/59.html>を参考に以下のようにしてみました。 func1はtestクラス内からしか呼び出せず、privateになっており、 func2はtestクラス外からも呼び出せて、publicになっているようです。 しかし、func2からfunc1を呼び出した際に、func2の呼び出しもとのオブジェクトを参照しようとすると undefinedになってしまいます。 var a = new test(); //a.func1(); // これはprivateなのでエラー a.func2(); // こちらはpublicなのでOK function test(){ var self = this; // private variable var data1 = 1; // public variable this.data2 = 2; // private function function func1(){ console.log(data1); // 1を表示 console.log(this.data2); // これがundefinedとなってしまう } // public function this.func2 = function(){ console.log(data1); // 1を表示 console.log(this.data2); // 2を表示 func1(); }; } どのようにすれば、オブジェクト変数を参照でき、 クラス内でのみ使用可能なprivate関数を定義できるのでしょうか。

  • プロトタイプの関数から、別のプロトタイプの関数を呼出すには?

    javascript初心者ですが、オブジェクトに関してわからないことがあるので、教えてください。(とんちんかんな質問かもしれませんが、ご容赦下さい。) 下記のような場合、関数calから関数setを呼出すのはどうすればよいのでしょうか? function Obj(){ } Obj.prototype.set = function(){ } Obj.prototype.cal = function(){ ここから、setを呼出すにはどうすればよいのでしょうか? } var obj = new Obj();

  • (function(){})()の意味

    (function(){})() の意味がよくわからずに困っています。 下記の2タイプではどう意味が変わってくるのでしょうか? (1)var fuga = function(){}; (2)var fuga = (function(){})(); 下記のコードで実験してみたところ、 --------------------- var fuga = function(){ this.obj = 'value'; }; var fuga = (function(){ return { obj = 'value'; }; })(); --------------------- (1)の場合は、newしないとfugaオブジェクトのメンバを使用できない、 (2)の場合は、newしなくてもfugaオブジェクトのメンバを使用できるようなのですが、 (2)で(function(){})を取り除いて出てくる()はnewのエイリアスだったりするのでしょうか? 

  • Object.definePropertyの簡略化

    下記に、Object.definePropertyの簡略化が掲載されているのですが、 「ReferenceError: config is not defined」になります。 http://qiita.com/tak0303/items/6c5cd59827e5398bcc22 ・config.valueって何ですか? ・どうやって動かすのでしょうか? var defineProp = function(obj, key, value){   config.value = value;   Object.defineProperty(obj, key, config); } var person = Object.create(null); defineProp(person, "car", "Delorean");

  • javascriptでオブジェクトのメソッドを使う

    JavaScriptでnewでオブジェクト化したクラス(?)のメソッド、フィールドを利用する方法を教えて下さい。 javascriptにもオブジェクト化という考え方があると聞いたのですが、 例えば、Javaでいうsetter getterのようなメソッドを作り、使用することはできるのでしょうか? 下記のようなコードを実行したところ Uncaught TypeError: Object #<mousePosi> has no method 'setPara' というエラーが出てしまい、setParaというメソッドはない。と言われてしまいます。 しかし、mousePosi()をオブジェクト化することはできているようなので、 setParaとgetParaを使えるのではないかとおもいました。 どなたかアドバイス下さい。お願いします。 ------------------------------------------------------------------------------------------------- (function LineMain() { console.log("マウスの位置座標を表示"); // console.log("X座標=" + mymouse.x + ",Y座標=" + mymouse.y); //マウスムーブでeventControlを呼び出し addEventListener("mousemove", eventControl, false); function eventControl(event) { var event = event; var myMousePosi = new mousePosi(); myMousePosi.setPara(event); // console.log("X座標=" + obj.getMouse().x + ",Y座標=" + obj.getMouse().y); } function mousePosi() { var paraMouse = { x : 0, y : 0 }; function setPara(event) { this.paraMouse.x = event.x; this.paraMouse.y = event.y; } function getPara() { return this.paraMouse; } } })();

  • オブジェクトの内容を確認する方法

    JavaScriptでオブジェクトの中身を確かめたいときに、 JSON.stringifyや下の関数のようなやり方がありますが、 var showObj = function(obj) { var props = ""; for (var prop in obj){ props += prop + "=" + obj[prop] + "\n"; } return props } JSON.stringify(Math)//{} showObj(Math)// となり、Mathオブジェクトの中身は確認できませんでした。 これはどういった理由によるものなのでしょうか。 また、(JavaScriptのコードから)確認する方法はあるのでしょうか。

  • objectの座標が取れない。

    JavaScriptを利用して、画面に仕込んだタグをポップアップのように 呼び出したいと思っています。 以下、概略ですが <div id ="test1" style="display:none;">テスト</div> <a href="javascript:balOpen(this,number)">呼び出し</a> 以下js function balOpen(obj,number) { document.getElementById('test' + number).style.display = 'block'; var positionX; var positionY; positionX = getLocation(obj, 'X'); positionY = getLocation(obj, 'Y'); } 画面をスクロールした際でも、画面中央に出したいので、座標を見て tes1のleftとtopを調整したいと思っています。 しかし、上記のような書き方をしても、X、Yの座標が取れず困っています。 何か良いやり方があれば教えていただけないでしょうか。 宜しくお願いします。