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

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

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

CoffeeScriptはプログラミング言語です。シンタックスシュガーの導入により、JavaScriptのコードに変換された後動作します。JavaScriptに比べ、可読性と簡潔性が向上しています。

Q&A

解決済

2回答

1857閲覧

【js+coffee】setIntervalで関数の参照が失敗する

drumath2237

総合スコア91

CoffeeScript

CoffeeScriptはプログラミング言語です。シンタックスシュガーの導入により、JavaScriptのコードに変換された後動作します。JavaScriptに比べ、可読性と簡潔性が向上しています。

0グッド

0クリップ

投稿2016/04/24 14:51

毎度お世話になっております。

coffee

1 2move = (direction = "top", minus = 1) -> 3 $('.falling').each(fun = () -> # 4 blockCSS = parseInt($(this).css("#{direction}").slice(0, -2)) 5 # blockBottom = parseInt($(this).css("bottom").slice(0, -2)) 6 # blockRight = parseInt($(this).css("right").slice(0, -2)) 7 if minus == 1 8 blockCSS += 30 if blockCSS < 600 9 else 10 blockCSS -= 30 if blockCSS > 0 11 console.log(blockCSS) 12 $(this).css("#{direction}", blockCSS) 13 ) 14 15$(window).on "keydown", (e) -> 16 # bot = $('#field').css("bottom") 17 # console.log bot 18 switch e.keyCode 19 when 40 20 move() 21 when 39 22 move("left", 1) 23 when 37 24 move("left", -1) 25 when 32 26 setInterval("move()", 1000) #<----ここ 27

このようなコードを書きましたが、なぜかsetIntervalのところでmove is not definedと言われてしまいます。他のWhenだと普通に動くのに、なぜかsetInterbalのところで参照エラー。
どなたか、解決策をご教授くださるとありがたいです。ちなみにコンパイルされたコードはこちら。

js

1// Generated by CoffeeScript 1.10.0 2(function() { 3 var move; 4 5 move = function(direction, minus) { 6 var fun; 7 if (direction == null) { 8 direction = "top"; 9 } 10 if (minus == null) { 11 minus = 1; 12 } 13 return $('.falling').each(fun = function() { 14 var blockCSS; 15 blockCSS = parseInt($(this).css("" + direction).slice(0, -2)); 16 if (minus === 1) { 17 if (blockCSS < 600) { 18 blockCSS += 30; 19 } 20 } else { 21 if (blockCSS > 0) { 22 blockCSS -= 30; 23 } 24 } 25 console.log(blockCSS); 26 return $(this).css("" + direction, blockCSS); 27 }); 28 }; 29 30 $(window).on("keydown", function(e) { 31 switch (e.keyCode) { 32 case 40: 33 return move(); 34 case 39: 35 return move("left", 1); 36 case 37: 37 return move("left", -1); 38 case 32: 39 return setInterval("move()", 1000); 40 } 41 }); 42 43}).call(this); 44

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

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

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

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

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

guest

回答2

0

自己解決

解決しました。
自分でもなぜ正常動作したのかわからないのですが。。。
出力されたjsファイルの最初の(function() {}).call(this);で囲っているのがダメだったらしく、これを消したら治りました。

投稿2016/04/26 11:31

drumath2237

総合スコア91

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

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

0

setInterval(move, 1000);

で出来ると思いますが、ぱっと見て気になった点を。

・setIntervalの戻り値はハンドル値です。
setIntervalをリターン文にくっつけると、意図しない動作をする可能性があります。

・setIntervalの解除をしていません。
エンドレスで処理が走っても問題ないならOKですが。

投稿2016/04/26 08:04

moredeep

総合スコア1507

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

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

drumath2237

2016/04/26 11:33

ご回答ありがとうございます。確かにreturn文にくっつけるのはよくないですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問