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

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

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

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

Q&A

解決済

3回答

1155閲覧

Javascript | 関数名にインデックス番号を付け加えたい

Onigirichan

総合スコア1

JavaScript

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

0グッド

0クリップ

投稿2021/08/25 21:23

forEachでイベントを登録する際に、インデックス番号を関数の末尾に付けようと思いましたが失敗しました。
以下が失敗したコードです。

Javascript

1paginationControl.forEach(function (el,i) { 2 el.addEventListener('click', function () { 3 app.ticker.add(slide + i); //エラー部分 slide0が入るようにしたかった 4 }) 5 }) 6function slide0(){ 7 console.log('slide0が実行されました'); 8 } 9function slide1(){ 10 console.log('slide1が実行されました'); 11 }

調べたところeval()にたどり着き、以下では成功しましたが、非推奨とのことで避けたいと思います。

Javascript

1paginationControl.forEach(function (el,i) { 2 el.addEventListener('click', function () { 3 app.ticker.add(eval('slide' + i)); //とりあえず成功 4 }) 5 }) 6function slide0(){ 7 console.log('slide0が実行されました'); 8 } 9function slide1(){ 10 console.log('slide1が実行されました'); 11 }

さらに調べたら配列に入れることを思いつき、最終的に以下になりました。

Javascript

1paginationControl.forEach(function (el,i) { 2 el.addEventListener('click', function () { 3 app.ticker.add(slideAction[i]); //とりあえず成功 4 }) 5 }) 6const slideAction = [slide0,slide1]; 7function slide0(){ 8 console.log('slide0が実行されました'); 9 } 10function slide1(){ 11 console.log('slide1が実行されました'); 12 } 13

質問したいことは以下の2点です。
1.この記述に問題はありますか? (一般的ではない、スマートじゃないなど)
2.最初のコードで、関数名に変数やインデックス番号を結合することはできないのでしょうか?
この疑問は根本的な理解ができていないはずなので、具体的でなくて構いませんので、◯◯で調べろ等ご助言を頂けないでしょうか。

よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

  1. について

要素が関数の配列があってもよいが、配列に入れるのであれば、個々の関数の名前に 0 だったり  1 だったりのインデクスが含まれている必要はないのでは?

  1. について

そやねー。答えになっとるかわからんが例を挙げときますー。ページネーションゆうことなら、関数名をたとえばprevSlide()nextSlide()にしとくやんか。ほんで、これらの関数を 'prev' だったり 'next' だったりの文字列を使って参照することは、こないにすればできるで。

まずは、こないなオブジェクト

javascript

1const slideActions = { 2 prevSlide: () => { 3 console.log('prevSlideが実行されました'); 4 }, 5 nextSlide: () => { 6 console.log('nextSlideが実行されました'); 7 } 8};

にスライドの動作をまとめておくやんか。ほんで HTMLがたとえばこう

html

1<div class="pagination"> 2 <button name="prev">前へ</button> 3 <button name="next">次へ</button> 4</div>

やったら、 paginationControls ゆう変数に

javascript

1const paginationControls = document.querySelectorAll('.pagination > button');

とかやって、2つのボタンを入れとくやん。
で、ボタンのname属性の 'prev''next' から、該当するアクションの関数を参照するには

javascript

1paginationControls.forEach(function (el) { 2 el.addEventListener('click', function () { 3 app.ticker.add(slideActions[`${el.name}Slide`]); 4 }); 5});

とすればええ。

ちなみに、forEach(function (el, i) で取れてくる i を使いたいのやったら、slideActionsのプロパティである関数名を

slide0: () => { console.log('slide0が実行されました'); }, slide1: () => { console.log('slide1が実行されました'); },

とかにして、

javascript

1app.ticker.add(slideActions[`slide${i}`]);

にすればいいわけやが、これだとHTML側でコントロール要素の配置順が変更されたら、JS側でも、paginationControls に入ってくる順番が変わるのやから、 slide0slide1を入れ換えないとあかんようになって、あまりよろしくない気もするで。デザインゆうんは頻繁に変更が入るもんやしな。

これで答えになっとる?ゆうんがイマイチ不安やが、参考にしたってや〜

投稿2021/08/25 23:05

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Onigirichan

2021/08/25 23:50

回答ありがとうございます! name属性を付与し、slideActions[`${el.name}Slide`]で取ってくるのは大変参考になりました。 具体例を提示いただいたお陰で簡潔なコードが書けそうです。
guest

0

ベストアンサー

1.この記述に問題はありますか?

配列で問題はありません。
配列以外から関数を使わないなら関数は無名で良いので、const slideAction = [function() { ... }, function() { ... }]; とするとより簡潔になります。

インデックスを引数にするのも良いですね。

js

1 app.ticker.add(slideAction.bind(null, i)) 2... 3 4function slideAction(i) { 5 ...

2.関数名に変数やインデックス番号を結合することはできないのでしょうか?

evel()以外に手段はないと思います。
一般的に、実行時に変数名や関数名を作ろうとするのは悪手です。

投稿2021/08/25 22:05

int32_t

総合スコア21597

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

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

Onigirichan

2021/08/25 23:52

回答ありがとうございます! 本トピックへの簡潔な回答かと思いましたので、ベストアンサーにさせて頂きました。 >実行時に変数名や関数名を作ろうとするのは悪手です。 肝に命じておきます。
guest

0

引数にインデックス番号与えた関数を呼びましょう。

#んで関数の中で条件分岐

投稿2021/08/25 22:02

y_waiwai

総合スコア88024

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

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

Onigirichan

2021/08/25 23:50

回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問