Javascriptについての質問

このQ&Aのポイント
  • Javascriptの質問についての要約文1
  • Javascriptの質問についての要約文2
  • Javascriptの質問についての要約文3
回答を見る
  • ベストアンサー

Javascriptについて質問です。

Javascriptについて質問です。 いまJavascriptを勉強しているのですがどうしても分からない所が出てきましたので是非ご教授願います。 教材を買ってきて勉強しているのですが、そこに載っているのものでこういった問題が書かれていました。    ↓ 以下のコードを分析して、アラートボックスに表示される値を書いてください。 function doThis(num){ num++; return num; } function doThat(num){ num--; return num; } var x=doThis(11); var y=doThat; var z=doThat(x); x=y(z); y=x; alert(doThat(z-y)); そこで分からなかったので答えを見てみるとこう書かれていました。 var x=doThis(11);          var y=doThat; var z=doThat(x); x=y(z); y=x; alert(doThat(z-y)); ↓↓ x=12 y=doThat z=doThat(12)=11 x=doThat(11)=10 y=10 alert(doThat(11-10)) 答え 0 そこでお聞きしたいのですが、まず 1、 右上のx=12というのはdoThis(11)はnum++があるから1足して12になった、という解釈でよいのでしょうか? 2、z=doThat(12)=11 の(12)は、xが12だからなのでしょうか?そして=11は、doThatがnum--だから1引かれて=11になるってことでしょうか? 3、ここからが本当にさっぱり分かりません。。x=y(z);はなぜx=doThat(11)=10になるのでしょうか?y(z)の(z)はdoThat(12)=11で、xは12なのでしょうか?なぜそれx=doThat(11)=10 になるんでしょうか? 4、y=10は、xがdoThat(11)=10だからそこの10が入ってるのでしょうか? 5、alert(doThat(11-10))でなぜ答えが0になるんでしょうか?なぜ11-10なのに1にならないんでしょうか? 分かりずらい質問の仕方で本当にすみません! 頭が混乱してしまって。。 それとreturnというのは関数からデータを返す、というのはなんとなくですが分かるのですが(でもたぶん分かってないです)ここではreturnはどんな働きをしてるのでしょうか? 色々サイトなど探して調べてはいるのですが、なかなか僕の頭も悪いと思うのですが難しくて理解できません。 もしお時間ありましたら、どなたか分かりやすく説明してもらえないでしょうか? returnの意味だけでもいいです。 すみませんよろしくお願いします!!

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

  • ベストアンサー
  • byDesign
  • ベストアンサー率75% (45/60)
回答No.1

>function doThis(num){ > num++; > return num; >} doThis関数は、与えられたものを1足し(num++)、その結果を返す(return num) >function doThat(num){ >num--; >return num; >} doThas関数は、与えられたものを1引き(num--)、その結果を返す(return num) >var x=doThis(11) xはdoThisの結果が入ります。 doThisは与えられたものを1足した結果を返すので、xに12が入ります >var z=doThat(x); zはdoThatの結果が入ります。 xには12が入っているので、doThat(12)の結果は11 よって、zに11が入る この時点では xには12 zには11が入っている >x=y(z); var y=doThat;より、 yにはdoThat関数が入っているので、 展開すると x=doThat(z); zには11が入っているので、doThat(11)の結果は10 この結果をxに入れるので、xに10が入ります この時点では xには10 zには11が入っている >y=x; yにx(10)を入れる この時点では xには10 yには10 zには11が入っている >alert(doThat(z-y)); zには11 yには10が入っているので、展開すると alert(doThat(11-10)); 11-10を計算すると alert(doThat(1)); alertはdoThat(1)の結果を表示するのですが doThat(1)は0を結果として返すので 最終的に0が表示されます。

nekoze-man
質問者

お礼

なるほどー!!!! すごくわかりやすい説明ありがとうございます!!!! やっと理解できました!!!! 参考書もこういう風に書かれているともっとJavascriptに理解が深められるのにと思います。 byDesign様のおかげでこれで前へ進めることが出来ました! ありがとうございます!!!!!

関連するQ&A

  • 教えてください。javascriptで困っています

    javascript初心者です。たくさんある変数をfor文を使って計算させたいと思っています。計算はfor分の中でしたいのですが、うまくいきません。以下のようなことをしたいのですが。evalなどを使うのでしょうか。調べるキーワードがわからなかったので、投稿させていただきました。教えてください。よろしくお願いします。 var x1=1; var x2=2; var x3=3; var x4=4; var x5=5; var y1=1; var y2=2; var y3=3; var y4=4; var y5=5; var z1; var z2; var z3; var z4; var z5; for(var i=0 i<5 i++){ "z"+i = "x"+i + "y"+i; } alert(z1); alert(z2); alert(z3); alert(z4); alert(z5);

  • javascriptのレキシカルスコープについて

    JSのレキシカルスコープがわかりません。 JSだと、一番外側のスコープで var str = "一番外側のスコープ"; とすると それ以降、ユーザー定義関数の中の、いわゆる関数スコープ内でも var str; と関数内で再定義しない限り、str = "一番外側のスコープ";を つかいまわすことになりますよね? 一度、関数内で、値を変更すると親スコープでもその変更が生きたままになると思います。 var str ="一番外側のスコープ"; function test(){ alert(str); str ="値の変更"; } alert(str) // 関数内で値をかえたけど、それが親スコープにも反映されてしまう。 このことがレキシカルスコープでしょうか? ただ、どこかのサイトで var num = 100; function makefunc() { return function() { alert(num); } } function callfunc() { var num = 50; var func = makefunc(); func(); }; callfunc(); でmakefunc()関数を呼び出した際の 関数内のnumという変数の値が100になるというのです。 実際、実行するとその通りなのですが、 var num = 50; という宣言は、callfunc() という関数の関数スコープ(ローカルスコープ) というのは理解しています。 でその中のいわゆる内部関数というのでしょうか? var func = makefunc(); func(); を実行した際の 変数numというスコープが 一番最初に宣言した  var num = 100; という値をさすというのです。(※そのサイトではこれをレキシカルスコープと呼んでいました) いったどういう動作がレキシカルスコープなのでしょうか? 他にも、クロージャともごっちゃになっております。 識者の方ご教授ください。 参考元はここです http://garden-place.jp/tech/javascript/scope-chain.html

  • javascriptのタイプミス

    javascript初心者です。以下のコードでどこにミスがあるのか 解りません。どこにあるのでしょうか? このソースをエディタに 貼ると見やすくなると思います。 <!DOCTYPE html> <html> <head> <title>SnakeBite</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <script type="text/javascript"> var W, H, S = 20; var snake = [ ], foods = [ ]; var keyCode = 0; var point = 0; var timer = NaN; var ctx; // pointオブジェクト function Point(x,y) { this.x = x; this.y = y; } //初期関数 function init() { var canvas = document.getElementById('field'); W = canvas.width / S; H = canvas.height / S; ctx = canvas.getContext('2d'); ctx.font = "20px sans-serif"; //蚊の初期化 snake.push(new Point(W / 2, H / 2)); //餌の初期化 for (var i = 0 ; i < 10 ; i++) { addFood(); } timer = setInterval("tick()", 200); window.onkeydown = keydown; } //餌の追加 function addFood() { while (true) { var x = Math.floor(Math.random() * W); var y = Math.floor(Math.random() * H); if (isHit(foods, x, y) || isHit(snake, x, y)) { continue; } foods.push(new Point(x, y)); break; } } //衝突判定 function isHit(data, x, y) { for (var i = 0 ; i < data.length ; i++) { if (data[i].x==x && data[i].y==Y) { return true; } } return false; } function moveFood(x, y) { foods =foods. filter(function (p){return (p.x !=x || p.y !=y);}); addFood(); } function tick() { var x = snake[0].x; var y = snake[0].y; switch (keyCode) { case 37: x--; break; //左 case 38: y--; break; //上 case 39: x++; break; //右 case 40: y++; break; //下 default: paint(); return; } //自分or壁に衝突 if(isHit(snake,x,y) || x<0 || x>=W || y<0 || y>=H ) clearInterval(timer); paint(); return; } //頭を先頭に追加 snake.unshift(new Point(x,y)); if(isHit(foods, x, y)) { point +=10; //餌を食べた moveFood(x,y); }else{ snake.pop(); //食べていない→しっぽを解除 } paint(); } function paint() { ctx.clearRect(0,0,W * S, H * S); ctx.fillStyle = "rgb(256,0,0)"; ctx.fillText(point, S, S * 2); ctx.fillStyle = "rgb(0,0,255)"; foods.forEach(function (p) { ctx.fillText("+", p.x * S, (p.y + 1) * S);}); snake.forEach(function (p) { ctx.fillText("*", p.x * S, (p.y + 1) * S); }); } function keydown(event) { keyCode = event.keyCode; } </script> </head> <body onload="init()"> <canvas id="field" width="400" height="400" style="background:#cccccc"> </canvas> </body> </html>

  • jQuery 同じ処理を関数にまとめたい

    jQueryでプログラムを書いています。 同じ処理が複数出てきているので一まとめにしてて見やすくしたいのですが・・・・ やり方がわかりません。 たとえば、 $("#id1").on("click",function(){ var num1=1; var num2=2; var a; a=num1 + num2; alert(a); }) $("#id2).on("hover",function(){ var num3=3; var num4=4; var b; b=num3 + num4; alert(b) }) のようにほぼ同じ処理を違うイベントで行う場合です。 関数自体は作れるのですが、、、、 function calc(numa,numb){ alert(numa+numb); } jquery内でjavascript(Java?)の関数は使えないというのを聞いたことがあります。 どのようにすれば使ええるのでしょうか?

  • javascriptのカプセル化について

    ただいま、javascriptの勉強をしている初学者であります。 テストプログラムを作ってみたのですが、思うように動作せず、理由が分からなくて悩んでいます。 オブジェクト指向のように、パブリックとプライベートの関数をそれぞれ作り、動作させようとしたのですが、method1()、method2()は続けて呼び出せるのですが、method3()を呼び出すことなく、プログラムが終了してしまいます。 ご指南よろしくお願いします。 var test1 = function(){ this.method1 = function(){ alert("method1"); method2(); }; var method2 = function(){ alert("method2"); this.method3();//呼ばれない? }; this.method3 = function(){ alert("method3"); }; };

  • 1 ~ Nまでの整数の総和(1+2+3...+N)を求めるJavaScriptの記述は?

    JavaScriptを学んでいます。初歩的な質問で大変申し訳ないのですが、どうしても自分で解決できずに困っています。 「1 ~ Nまでの整数の総和(1+2+3...+N)を求める関数を持つスクリプトを作成する」というのが目標なのですが、下記のようなスクリプトはinternet Explorerでは動作しません。MozillaFirefoxおよびOperaでは意図したとおり動作できることを確認しています。どこに誤りがあるのでしょうか?どなたかアドバイスをお願いいたします。 <html> <head> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>kadai</title> <script type="text/javascript"> <!-- function keisan(num1,num2){ return num1*num2/2; } //--> </script> </head> <body> <script type="text/javascript"> <!-- var num1 = prompt("1~入力データまでの総和を計算します。",""); var num2 = num1++; alert("1 ~ 入力データまでの総和は、" + keisan(num1,num2) + "です。"); //--> </script> </body> </html>

  • 戻り値必要なし

    JavaScript初心者です。 戻り値なしの関数について。return とreturn falseでは何か違うのでしょうか? function test(){ if(flag) return; var num=1+2; } function test2(){ if(flag) return false; var num=1+2; } よろしくお願いします。

  • javascriptの打ちミスしてる所を知りたい。

    参考書の通り打ちました。参考書では、蛇を上下左右キーで操作し、餌を食べさせるゲームと書いておりましたが、灰色のイメージが出るだけで、蛇っぽいのは出ません。 たぶんどっかでタイプミスしてると思うのですが、どこだかわかりません。 教えてください。 <!DOCTYPE html> <html> <head> <title>SnakeBite</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <script type="text/javascript"> var W,H,S=20; var snake=[],foods=[]; var keyCode=0; var point=0; var timer=NaN; var ctx; function Point(x,y){ this.x=x; this.y=y; } function init(){ var canvas = document.getElementById('field'); W=canvas.width/S; H=canvas.height/S; ctx =canvas.getContext('2d'); ctx.font ="20px sans-serif"; snake.push(new Point(W/2,H/2)); for(var i=0; i<10;i++){ addFood(); } timer=setInterval("tick()",200); window.onkeydown =keydown; } function addFood(){ while(true){ var x =Math.floor(Math.random()*W); var y =Math.floor(Math.random()*H); if(isHit(foods,x,y)|| isHit(snake.x,y)){ continue; } foods.push(new point(x,y)); break; } function isHit(data,x,y){ for(var i=0;i<data.lenght;i++){ if(data[i].x==x && data[i].y==y){ return true; } } return false; } function moveFood(x,y){ foods =foods.filter(function(p){ return(p.x !=x || p.y !=y); }); addFood(); } function tick(){ var x=snake[0].x; var y=snake[0].y; switch(keyCode){ case 37:x--;break; case 38:y--;break; case 39:x++;break; case 40:y++;break; defaule:paint(); return; } if(isHit(snake,x,y) || x<0 ||x>=W || y<0||y>=H) { clearInterval(timer); paint(); return; } snake.unshift(new Point(x,y)); if(isHit(foods,x,y)){ point+=10; moveFood(x,y); }else{ snake.pop(); } paint(); } function paint(){ ctx.clearRect(0,0,W*S,H*S); ctx.fillStyle="rgb(256,0,0)"; ctx.fillText(point,S,S*2); ctx.fillStyle="rgb(0,0,255)"; foods.forEach(function(p){ ctx.fillText("+",p.x*S,(p.y+1)*S); }); snake.forEach(function(p){ ctx.fillText("*",p.x*S,(p.y+1)*S); }); } function keydown(event){ keyCode=event.keyCode; } </script> </head> <body onload="init()"> <canvas id="field" width="400" height="400" style="background:#cccccc"> </canvas> </body> </html>

  • 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について教えてください。

    divのボタンを作りたいと思い、調べながらjQueryを使う方法は以下のようにしたらいい事は分かったのですが、jQueryを使わずにしようと思い $(function(){ $("div").click(function(){ var x = this.id; alert(x); }); }); の部分を document.getElementsByTagName("div").onclick = function(){ var x = this.id;  alert(x); }; としてみたのですが、うまくいきません。jQueryを使わずに同じようなボタンを作るにはどうしたらいいのでしょうか? <!doctype html> <html> <head> <meta charset="UTF-8"> <title>無題ドキュメント</title> <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.4.min.js"></script> <script type="text/javascript" language="javascript"> $(function(){ $("div").click(function(){ var x = this.id; alert(x); }); }); </script> </head> <body> <div id="aaa" class="div_link">a</div> <div id="bbb" class="div_link">b</div> <div id="ccc" class="div_link">c</div> <div id="ddd" class="div_link">d</div> <div id="eee" class="div_link">e</div> </body> </html>

専門家に質問してみよう