🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

Q&A

3回答

1740閲覧

JavaScriptの関数テーブルについて

soda346

総合スコア18

JavaScript

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

1グッド

1クリップ

投稿2019/10/11 21:55

他の言語では「関数テーブル」という手法が使われますよね?
http://www.c-lang.org/pointer_function.html

「if文やswitch文の条件分岐等をなくしプログラムを簡素化する」というメリットがあります。

ifやswitchだと行数が多くなります。
switch (data) {
case 0: func(); break;
case 1: func1(); break;
case 2: func2(); break;
case 3: func3(); break;
case 4: func4(); break;
default: func4(); break;
}

関数テーブルだと2行です
var funcs = [func, func1, func2, func3, func4];
funcs2;

しかし、JavaScript界隈では「関数テーブル」という題の記事を見かけません。
類似の関数をまとめておいて引数で呼び出し対象を変えるのは便利だと思いますが。
何かデメリットがあるのでしょうか?遅いとか。

※調べた限りでは、このサイトでディスパッチテーブルの一文がありますが
https://qiita.com/hirokidaichi/items/c9a76191216f3cc6c4b2

ループ外では一般的に使われるものではないのでしょうか?
(引数で分岐させるなど他の手法の方が良いですか?)

uwflza👍を押しています

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

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

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

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

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

guest

回答3

0

使ったっていいと思いますよ。しかし、処理内容が小さい時には大袈裟かもしれませんし、大きい時には継承を使うのが適切なこともあるかもしれません。
関数テーブルの役割の一部は継承に奪われていますから、オブジェクト指向言語では比較的出番が少なくなっている気がします。

投稿2019/10/11 22:24

Zuishin

総合スコア28669

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

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

soda346

2019/10/11 23:31

なるほど、継承を使うんですね。 しかし使っても良いと(継承するほど大きいかどうか...) とにかく、ありがとうございます。 上級者の方にお墨付きを頂けて安心しました。
Zuishin

2019/10/11 23:48

上級者ではなく初心者ですが、上級者の方からも高評価をいただいているので間違ってはいないと思います。
guest

0

switch

switch を配列に置き換える手法は珍しいものではありません。

※「関数テーブル」という名前が広く使われていない事は重要ではないと私は思います。
switchを配列に変換するアイデアの範疇です。

オブジェクト初期化子

keyが数値のみだと人間にわかりやすくない為、オブジェクト初期化子を使うコードを多く見かけます。

JavaScript

1const langObj = {javascript: new Function, c: new Function, python: new Function};

new Map

__proto__ に代入制約等のオブジェクト初期化子の制限を突破するには、new Map を使う方法があります。

JavaScript

1const langMap = new Map([['javascript',new Function],['c',new Function],['python',new Function]]);

class

更に、抽象化するには class を使います。

javascript

1class Lang { 2 javascript () {} 3 c () {} 4 python () {} 5} 6 7new Lang().javascript();

Re: soda346 さん

投稿2019/10/12 04:07

編集2019/10/12 04:08
think49

総合スコア18189

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

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

soda346

2019/10/12 22:40

>switch を配列に置き換える手法は珍しいものではありません。 なるほど。確かに結構出てきました。 リンクなど大変参考になりました。 今後はオブジェクト初期化子でやってみます。 ありがとうございます。
guest

0

「if文やswitch文の条件分岐等をなくしプログラムを簡素化する」というメリットがあります。
...
しかし、JavaScript界隈では「関数テーブル」という題の記事を見かけません。

おおげさに当たるかもしれないので参考ですが。
switch で関数を呼び分けるのを置き換えるたい場合は、ポリモーフィズムでやりたくなるからかなとは思います。

下記リンクの「ダックタイピング」の例のようなものです。
https://qiita.com/Nossa/items/a93024e653ff939115c6

投稿2019/10/12 02:50

編集2019/10/12 02:52
tanishi_a

総合スコア484

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

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

soda346

2019/10/12 22:36

なるほど。 ダックタイピングで書きたがる。 今後はそれで書いてみようと思います。 オブジェクトは記述が多くなるので関数で書きがちです汗
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問