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

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

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

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Q&A

解決済

3回答

804閲覧

JavaScriptの()を用いた式の記法について知りたい。

Buntin

総合スコア14

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

0グッド

0クリップ

投稿2023/02/20 13:14

実現したいこと

記法の名前が知りたい

前提

たまに以下のようなコードがあると思います。動く理由とかはわかるのですが、この記法の具体的な名称があるなら知りたいです。
よろしくお願いします。

エラーメッセージ

該当のソースコード

javascript

1(async () => { 2 const tweets = await formattedDB.find({}); 3 let tweetArray = []; 4 for (const item of tweets) { 5 const tweetObj = new tweet(item); 6 tweetArray.push(tweetObj); 7 console.log(tweetObj.attachments); 8 } 9})();

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

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

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

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

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

guest

回答3

0

質問文の該当のソースコード全体は「即時実行関数」や「即時関数」ですが、
これはJavaScript(以下JS)の仕様を組み合わせた「テクニック」の話になります。

なのでこれらを覚えて帰ってください

これらがどう関わってくるのかを順に解説していきます。


そもそも丸括弧()なんかで囲わずに
そのままasync () => {関数の中身}()って書けば良いじゃん。
しかしそれは出来ません。

JSではブロック文{}が終わる時、
強制的に;を補って改行してしまうというはた迷惑なルールが存在します。
https://jsprimer.net/basic/statement-expression/

つまりasync () => {関数の中身}()は別の行として区切られてしまい
JSに「なんなの?この単体()は?何か値入れろよ」とエラーになってしまいます。
Uncaught SyntaxError: Unexpected token ')'


でも実際には似たような事は実現できてるじゃん。
「関数宣言」は駄目だけど「関数式」なら出来ますよ。

JSには関数宣言関数式が存在します。

この2つのどちらになるかは行の先頭にあるか否かで決まります。

{}の終了時の強制的な改行は関数宣言のみ、
関数式の方は強制的な改行が発生しない仕様になっています。


丸括弧には主に3つの使い方があります。

  • ifやforなどの決められた箇所での利用→ルールなので従わないとエラー
  • 関数実行→値の後ろで使った場合
  • グループ化演算子→上記以外

グループ化演算子!などという大げさな名前ですが、なんのことはない
四則演算等の優先順位を無視して先に計算しましょうね。
……という算数や数学で出てくるただの丸括弧です。

そんなもんがなんで即時関数の役に立つんだ?

グループ化演算子で関数を包めば、行頭の文字が関数で始まらなくなりますね。
これでサンドイッチにして関数式を作りたいってだけなんです。

つまり(async () => {関数の中身})()は通ります。
この2つの仕様を使ったテクニックが「即時関数」や「即時実行関数」と呼ばれるテクニックになります。


行頭に何でも良いから文字挟めば良いならさ、丸括弧()である必要はなくね?

  • !function(){}()
  • !!function(){}()
  • +function(){}()
  • -function(){}()

実際試せば全部動きます。

ただし、実際に実行すれば弊害がよく分かります。
!はbooleanに勝手に型変換されますし
+-は数値に勝手に型変換されます。

その辺邪魔しないグループ化演算子が良い子で使いやすいですね。
即時実行関数を書きたい場合はほぼ全ての現場が丸括弧で包むというやり方でやっています。

投稿2023/02/21 03:32

編集2023/02/21 03:39
miyabi-sun

総合スコア21158

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

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

Buntin

2023/02/21 08:41

めちゃくちゃわかりやすかったです。ご丁寧にありがとうございます!
guest

0

IIFE (Immediately Invoked Function Expression)= 即時実行関数式

投稿2023/02/20 13:30

yambejp

総合スコア114843

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

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

Buntin

2023/02/20 14:13

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

0

ベストアンサー

即時関数と呼ばれます

投稿2023/02/20 13:29

iFQ7Vj

総合スコア52

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

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

Buntin

2023/02/20 14:14

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問