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

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

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

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

Q&A

解決済

2回答

1679閲覧

callbackを実装したい

meron-pan

総合スコア44

JavaScript

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

0グッド

0クリップ

投稿2017/12/26 14:51

編集2017/12/26 15:20

###前提・実現したいこと
画面が黒から白へフェードアウトした後、関数が実行されるようなプログラムを作ろうとしています。
callbackを実装しようと思ってプログラムを書いたのですが、callbackが実行されず、オブジェクトが存在しないと言われました。コードには、スペルミスも何もないはずなのですが、なぜ動かないのかわかりません。どうすれば、callbackが動くようになるのでしょうか?
###発生している問題・エラーメッセージ

SCRIPT5007: Object expected sample.js (28,5)

###該当のソースコード

Javascript

1canvas1 = document.createElement("canvas"); 2canvas1.width = 1200; 3canvas1.height = 600; 4document.body.appendChild(canvas1); 5layer1 = canvas1.getContext("2d"); 6 7 8animation = function (ctx) { 9 this.myColor = new Array( 10 "#000000", "#101010", "#202020", "#303030", 11 "#404040", "#505050", "#606060", "#707070", 12 "#808080", "#909090", "#A0A0A0", "#B0B0B0", 13 "#C0C0C0", "#D0D0D0", "#E0E0E0", "#FFFFFF" 14 ); 15 var myCnt = 0; 16 var local_myColer = this.myColor; 17 myFade = function (callback) { 18 if (myCnt != 16) { 19 ctx.clearRect(0, 0, 100, 100); 20 ctx.fillStyle = local_myColer[myCnt]; 21 ctx.fillRect(0, 0, 100, 100); 22 var myTime = (myCnt == 0 || myCnt == 15) ? 1000 : 50; 23 myCnt++; 24 setTimeout("myFade()", myTime); 25 } else { 26 ctx.clearRect(0, 0, 100, 100); 27 console.log(callback); 28 callback(); 29 } 30 } 31} 32 33aaa = function(){ 34 alert("実行しました"); 35} 36 37animation(layer1); 38myFade(aaa);

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

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

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

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

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

guest

回答2

0

解決済みのようですが、別解を。

setTimeout の第三引数

最近の実装では setTimeout第三引数を指定する事で、タイマー実行関数の引数として解釈されます。

JavaScript

1setTimeout(myFade, myTime, callback);

Polyfill

IE9- では使えませんが、Polyfill を適用すればいいでしょう。

Re: meron-pan さん

投稿2017/12/27 02:59

think49

総合スコア18164

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

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

0

ベストアンサー

setTimeoutメソッドに渡している内容に問題があるからです.

あなたのコード

JavaScript

1setTimeout("myFade()", myTime);

では引数として渡したコード"myFade()"が評価された際, 関数myFadeに渡されるべき変数callbackが未設定になっているためエラーとなっています.

ですから

JavaScript

1setTimeout(function(){myFade(callback)}, myTime);

のように, 繰り返し処理の際にもmyFadeに対して引数を設定します.

NOTE:
setTimeout関数にコード文字列を渡すのはあまりおすすめできません. eval関数と同様にメソッド呼び出しの都度コードが評価されるため, ブラウザ内部での最適化処理において極めて不利に働くからです.

投稿2017/12/26 19:54

defghi1977

総合スコア4756

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

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

meron-pan

2017/12/27 02:31

回答ありがとうございます。setTimeoutの方がコードにミスがあったとは気が付きませんでした。返信が遅くなってしまい申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問