• ベストアンサー

呼び出し方でthisが変わる

var A=new function(){this.a=function(){alert(this===window)}}; A.a();(A&&A.a)() A.aの1回目の呼び出しではfalse,2回目の呼び出しではtrueとなるのですがどうしてそうなるのかが分かりません。分かる方がいましたらご教授よろしくお願いします

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4851/10265)
回答No.1

後者は、(function(){alert(this==window)})(); と同じです。 (A&&A.a)が式なので。 A.a の値も function(){alert(this==window)} なのですが、これを呼び出すときにレシーバーがAになります。 (式)()のときはレシーバーが省略と見なされてthisがグローバルオブジェクトのwindowになります。 レシーバーを明示指定して呼び出した (A&&A.a).call(A) だと false になります。

yanlahi
質問者

お礼

回答ありがとうございます。call使えばいいんですね。とても参考になりました

関連するQ&A

  • 【javascript】prototypeを使って宣言したfunctionでthis.の値が取れない

    以下HTMLは開いた時に'aaa'がアラートされるつもりで作りました。 ※行頭は全角スペースです。 <html> <head> <script type="text/javascript"><!-- function hoge(){  this.val ='aaa'; }; hoge.prototype.func = function(){  alert(this.val); }; h = new hoge(); if(window.addEventListener){  window.addEventListener('load', h.func, false); }else{  window.attachEvent('onload', h.func); } //--></script> </head> <body> </body> </html> 結果は、undifindがアラートされました。 alert(this.val); を alert(h.val); とベタに記述すれば回避できますが、ちょっと違和感を感じます。 このような場合、どのような記述がベターなのでしょうか?

  • 関数の実行ができません

    function printData($str) { print("alert($str)"); return true; } print("<td><a href=\"#\" onClick=\"alert($i);return false\">$i</a></td>\n"); 上記を参考に関数(printdata)の呼び出しをおこなったの ですがうまく呼び出しできません。 print("<td><a href=\"#\" onClick=\"new Function($this->printdata($i))\";return false\">$i</a></td>\n"); どなたかご存知でしたら教えてください。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • イベントリスナーの部分を関数にしたい

    イベントリスナーの部分で、「load」以外に「change」も必要になったので関数にしたいのですが、 引数の関数の指定方法がわかりません。 どうすればいいのでしょうか。よろしくお願いします。 【イベントリスナーを関数にする前】 function hoge(){ this.view = function(){ var _this = this; window.addEventListener( 'load',function(){ _this.foo()}, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view(); 【やってみたこと】 function hoge(){ this.view = function(){ var _this = this; var func = function(){ _this.foo()}; this.addListener( 'window', 'load', func ); } this.addListener = function(elem,type,func){ elem.addEventListener( type,func, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view();

  • newでコンストラクタ関数が受け取った引数の行き先

    ・Test1とTest2で何が違うのでしょうか? ・Test1のtenは、this.scoreで生成するインスタンスプロパティへ格納 ・Test2のtenは、どうなっているのでしょうか? ・どこへも格納していないのに、「new Test2('100');」で文が終わった後、呼び出せている理由は? ■Test1 var Test1 = function (ten) {  this.score = ten;  this.getScore = function() {   alert(this.score);  } } var result1 = new Test1('100'); result1.getScore(); ■Test2 var Test2 = function (ten) {  this.getScore = function() {   alert(ten);  } } var result2 = new Test2('100'); result2.getScore(); ■下記★部分の「alert(this.score);」「alert(ten);」何れも100と表示されるのですが、中でどういう処理が走ってそういう結果になるのでしょうか? var Test3 = function (ten) {  this.score = ten;  this.getScore = function() { //★  alert(this.score);   alert(ten); } } var test3 = new Test3('100'); test3.getScore();

  • JavaScriptのthisの挙動について

    JavaScriptで次のCodeのようなコードを書いて実行したところ、Outputのようになります。 原因は、thisが保持できていなかったからです。 ※先頭に#が付いているのが問題の箇所です。 Code: Array.prototype.rs = function() // rs = random sort { var ret = { list: new Array(), length: new Number() }; # var obj = { # list: this # }; var tmp = { index: new Number(), length: obj.list.length }; while((ret.length = ret.list.length) < tmp.length) { tmp.index = Math.floor(Math.random() * (tmp.length - ret.length)); ret.list[ret.length] = obj.list[tmp.index]; obj.list.splice(tmp.index, 1); } return ret.list; } var list = new Array(1,2,3,4,5,6,7,8,9); alert(list.rs()); alert(list.rs()); Output: アラートウィンドウで 2,4,6,9,3,5,1,8,7 (一例) アラートウィンドウで 出力無し 要するに、thisをobj.listに入れて、thisには触っていないのに、obj.listと同期してthisが消えているのです。 Code中で先頭に#を付けた部分を次のように変更すると期待通りに動作しましたが、腑に落ちません。 # var obj = { # num: this.join('') # }; # obj.list = obj.num.split(''); もっと簡潔な書き方や、迅速に動く書き方があればご教授頂きたいです。

  • イベントリスナーで読み込んだ後に、DOMで文字を表

    イベントリスナーで読み込んだ後に、DOMで文字を表示させたい。 DOMを使って、文字を表示させるならイベントリスナーで読み込み必要があると思いました。 そこで、下記のように書いて試してみました。 function hoge(){ this.view = function(){ window.addEventListener( 'load',this.foo, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view(); すると、「undefined」と表示されます。 どうすればいいのでしょうか。よろしくお願いします。

  • setTimeoutのthis参照について

    prototypeメソッドの中でsetTimeout関数を使用したところ、thisで自身の関数を参照しなくなりました。setTimeoutの挙動についてぐぐってみたのですが、いまいちsetTimeoutを使用したときのスムーズな記述方法がわかりません。 ******************************** var hoge=function(){ this.myName="ほげ"; } hoge.prototype={ init:function(){ setTimeout(function(){ hoge.prototype.displayName(); // ★(1)setTimeout関数の中でのメソッドの適した呼び出し方は? // ↑の記述でも呼び出せるけど、間違ってる気がする。。 },1000) }, displayName:function(){ // ★(2)ここでhogeオブジェクトのmyNameプロパティを参照するにはどう記述すれば良いのか? //console.log(this.myName); //↑setTimeoutを使ったのでthis参照はwindowオブジェクトになっているから違う //console.log(hoge.myName); →undefinedを返す } } window.onload=function(){ var a=new hoge(); a.init(); } ******************************** 上記のようなprototype関数を使用したときのスムーズな記述方法を教えていただけませんでしょうか。 知りたいのは下記2点です。 ★(1)prototypeメソッドを使用したとき、setTimeout関数の中でのメソッドの適した呼び出し方は? ★(2)setTimeout関数内で呼び出したメソッドから、自身のオブジェクトのプロパティを参照するにはどう記述すれば良いのか? 初心者なので説明が下手だったり、質問内容で間違った記述があるかもしれません。 質問内容で問題がありましたらご指摘いただけると助かります。

  • JavaScript thisとvarの違い

    以下のスクリプトをRhino 1.7 で実行しました。 var a = 1; this.a = 2; function MyFunc() { var a = 3; this.a = 4; print(a); } var func = new MyFunc(); print(a); print(this.a); print(func.a); 結果は以下の通りです。 3 2 2 4 1行目と4行目の結果が違います。 トップレベル(2と3行目)ではthisとvarの値が同じなのに1と4行目の値が違うのは、どのような理由でしょうか? JavaScriptの動作から含めて、教えていただければ幸いです。 よろしくお願いします。

  • this.nの記述について

    ムービクリップのa1,a2,a3,a4をロールオーバするとそれぞれ対応する数字のh1,h2,h3,h4のムービクリップのalphaが0から100にtweenを使って動かすことを考えたいと思います。 //初期設定 var obj_array:Array = new Array(); for (var i = 1; i<=4; i++) { obj_array[i] = eval("a"+i); obj_array[i]._alpha = 0; } //ここからロールオーバの操作 import mx.transitions.*; import mx.transitions.easing.*; for (var i = 1; i<=4; i++) { // 各ボタンの固有値 n を設定 this["h"+i].n = i; // 各ボタンの onRollOver 動作定義 this["h"+i].onRollOver = function() { var tween_handler:Object = new Tween("a"+this.n, "_alpha", Strong.easeOut, 0, 100, 1, true); };  しかし、まったく動作しません。理由としては何が考えられるでしょうか。

    • ベストアンサー
    • Flash
  • 以下のスクリプトがVista×IE8、Firefox(現時点でわかって

    以下のスクリプトがVista×IE8、Firefox(現時点でわかっているところで)で、 想定と異なった動作をしてしまいます。 XP上であれば、特に問題なく動くのですが、Win7は手元にないので、わかりません。 しかし、原因が一向にわからず・・・。 ご教授いただけますと幸いです。 var xhr; function prefCheck(){   ~省略~ xhr = false; if(window.ActiveXObject) { try { xhr = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) { xhr = new ActiveXObject('Microsoft.XMLHTTP'); } } else if(window.XMLHttpRequest) { xhr = new XMLHttpRequest(); xhr.overrideMimeType('text/xml'); } xhr.onreadystatechange=PrefCheck; xhr.open("GET","hogehoge.php, true); xhr.send(null); } function PrefCheck(){ if ((xhr.readyState == 4) && (xhr.status == 200)){ window.alert("hogehogehogehogehogehoge"); } }