質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

3576閲覧

javascriptのメソッドでの再帰処理は?

gyojin

総合スコア94

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2015/07/10 21:07

編集2015/07/10 21:08

練習がてら画面上部にある要素のtopをマイナスにして上にひっこめてしまう関数をall javascriptで作成しました。
使いまわしができるようにオブジェクトにしてしまおうと考えとりあえず関数名をメソッドに変えて試しに動かしてみたらエラーが出ました。
メソッドで再帰処理をしようとしているのが原因の様ですが
再帰処理には知識が無いため、メソッドで再帰をするいいやり方が思い浮かびませんでした。
再帰処理をやめて書き直すべきなのでしょうか?

あと再帰処理に関していい参考書があればお教え願えるとありがたいです

lang

1//hiddenElement.js 2//hiddenElement. 3//4つのメソッド 4//登録 5// hiddenElement.entry(Ypx,element); 6// 7//Ypxは反応するスクロール量、elementは隠したいエレメント 8//スクロール量が規定に達すると画面上の隠したいエレメントをtopを操作することで隠してしまう。 9//問題点 10// 1.操作量が15pxごとなので中途半端な大きさのエレメントだと全部隠れてくれない 11// 2.再読み込みに対応していない 12// 3.IEだと動かない(はず)、setTimeoutの引数渡し方法を修正すると治るはず 13// 14 15//エレメントを隠す 16//該当エレメントのtopとheightを調べ、一定間隔ごとにtopを減らしていきheightと同値になると終了 17 18var hiddenElement={ 19 hide:function (element){ 20 var top=element.offsetTop; 21 var height=element.offsetHeight; 22 if(0>=(top+height)){ 23 return; 24 } 25 setTimeout( 26 function(element,top){ 27 element.style.top=top-15+"px"; 28 this.hide(element); 29 } 30 ,10,element,top); 31 }, 32 show:function(element){ 33 var top=element.offsetTop; 34 var height=element.offsetHeight; 35 if(0<=top){ 36 return; 37 } 38 setTimeout( 39 function(element,top){ 40 element.style.top=top+15+"px"; 41 this.show(element); 42 } 43 ,10,element,top); 44 }, 45 //スクロール検知() 46 senseEvent:function(Ypx,element){ 47 var a=document.body.scrollTop; 48 var b=document.documentElement.scrollTop; 49 c= a || b; 50 //条件成立なら 51 if(c>Ypx){ 52 this.hide(element); 53 }else if(0>element.offsetTop){ 54 this.show(element); 55 }; 56 }, 57 58 entry:function (Ypx,element){ 59 window.addEventListener("scroll",function(){ hiddenElement.senseEvent(Ypx,element); },false); 60 } 61 62 63 64}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

JavaScript のよくある問題として、下記のような呼び方だと (1) の部分で this が Windows オブジェクトになるため、(2) は undefined になります。

lang

1var obj = { 2 aaa: function(){ 3 setTimeout(function(){ 4 console.log(this); // (1) Windows 5 console.log(this.bbb); // (2) undefined 6 }, 1); 7 }, 8 bbb: function(){ 9 console.log("this is bbb"); 10 }, 11}; 12 13obj.aaa();

次のように setTimeout の外側で this を self などの変数に入れて、setTimeout の中のクロージャーに束縛させることで回避できます。

lang

1var obj = { 2 aaa: function(){ 3 var serf = this; 4 setTimeout(function(){ 5 serf.bbb(); 6 }, 1); 7 }, 8 bbb: function(){ 9 console.log("this is bbb"); 10 }, 11}; 12 13obj.aaa();

もしくは Function.bind を使うこともできます。このようにすれば setTimeout に渡しているクロージャーの中の this が bind の引数に渡したオブジェクトになります。

lang

1var obj = { 2 aaa: function(){ 3 setTimeout((function(){ 4 this.bbb(); 5 }).bind(this), 1); 6 }, 7 bbb: function(){ 8 console.log("this is bbb"); 9 }, 10}; 11 12obj.aaa();

投稿2015/07/11 01:28

ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gyojin

2015/07/12 00:39

ありがとうございます。Function.bindは面白いですね。 setTimeout内でのthis使用に問題があるとは気が付きませんでした。 素人ゆえの発想ですがthisではなくオブジェクト名を直書きでもいいのでしょうか?
ngyuki

2015/07/12 01:24

「setTimeout内での」というより、クロージャーの中ので、です、setTimeout はあまり関係ありません。 この例ではオブジェクト名を直書きでも大丈夫かもしれません。 が prototype を使って普通のクラスベースの書き方になるとその方法は使えなくなります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問