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

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

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

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

Q&A

解決済

2回答

6610閲覧

setIntervalのコールバックに関数式を書いたとき、インターバル毎に新しく関数オブジェクトが作られるのか?

_kari_

総合スコア34

JavaScript

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

1グッド

3クリップ

投稿2021/04/17 06:42

JavaScriptの質問です。

こちらの動画で、

「setIntervalの中で関数定義をすると実行するたびに毎回関数を作ることになるので、外に書いたほうがいい」

と言われていました。

つまり、

Javascript

1setInterval(function() { 2 // 処理 3}, 1000);

とすると1秒おきに新しく関数オブジェクトを作ってから実行することになるので、

Javascript

1function myCallback() { 2 // 処理 3} 4 5setInterval(myCallback, 1000);

のように外に切り出すべきということでした。

これは本当でしょうか?
自分はsetIntervalの実行時に関数オブジェクトが一度だけ作られ、指定ミリ秒ごとにその関数を実行するものと思っていました。
可読性や保守性の面で外に切り出すのはわかるのですが、関数オブジェクトの作成が毎回行われるから外に出すというのは初耳でした。
(一応、関数の代わりに文字列を使う構文では指定時間ごとに文字列をコンパイルして実行するとMDNに書いてありました。)

また、addEventListenerやArray.prototype.forEachではどうなるのでしょうか。
中に関数式を書いてしまうとイベント発火毎や配列反復毎に関数オブジェクトが毎回作られるのですか?

Hawn👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

1秒おきに新しく関数オブジェクトを作ってから実行することになるので

なりません。

setInterval呼び出す側で関数オブジェクトが作られてそれが引数になるだけですので、実行ごとに新たな関数が作られるわけではありません。

投稿2021/04/17 06:44

maisumakun

総合スコア146018

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

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

0

setIntervalはコールバックを無名関数にしてもしなくてもかわらないでしょう
addEventListenerの場合、無名関数は同じ内容を書いても追加されるので
別途宣言した関数を使うメリットはあります。

javascript

1<div id="hoge">hoge</div> 2<div id="fuga">fuga</div> 3<script> 4const hoge=document.querySelector('#hoge'); 5const func=()=>console.log(1); 6hoge.addEventListener('click',func); 7hoge.addEventListener('click',func); 8hoge.addEventListener('click',func); 9const fuga=document.querySelector('#fuga'); 10fuga.addEventListener('click',()=>console.log(2)); 11fuga.addEventListener('click',()=>console.log(2)); 12fuga.addEventListener('click',()=>console.log(2)); 13</script>

※funcを指定したhogeは一度しか追加されませんが無名関数で追加したfugaは
都度追加されています

投稿2021/04/17 12:18

yambejp

総合スコア116724

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問