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

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

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

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

クロージャ

クロージャは、プログラミング言語における関数オブジェクトの一種です。 引数以外の変数を実行時の環境ではなく、 自身が定義された環境において解決することを特徴とします。

Q&A

解決済

3回答

627閲覧

関数をconstに代入しないとエラーになる理由

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

クロージャ

クロージャは、プログラミング言語における関数オブジェクトの一種です。 引数以外の変数を実行時の環境ではなく、 自身が定義された環境において解決することを特徴とします。

0グッド

0クリップ

投稿2022/08/07 23:21

MDNのクロージャについての記事で、以下のコードについて質問があります。

function makeFunc() { var name = 'Mozilla'; function displayName() { alert(name); } return displayName; } var myFunc = makeFunc(); myFunc();

この

var myFunc = makeFunc(); myFunc();

の関数の呼び出し部分を、ただ単にmakeFunc();と記述しても同様の結果が得られると思ったのですが、エラーになってしまいました。

なぜmyFuncに代入する必要があるのでしょうか。

ご回答頂けると幸いです。

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

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

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

int32_t

2022/08/07 23:28

> エラーになってしまいました。 どんなエラーですか?
退会済みユーザー

退会済みユーザー

2022/08/07 23:40

function makeFunc() { var name = 'Mozilla'; function displayName() { alert(name); } return displayName; } makeFunc(); ↓ ƒ displayName() { alert(name); } こんな感じで、関数displayNameがそのまま帰ってきてしまいます。 returnでdisplayNameが戻り値になるようになっているので、こうなることは分かるのですが、なんでmyFuncに代入するとエラーが出なくなるのかなと思いました。
int32_t

2022/08/07 23:43

それはふつう「エラーになる」とは言いません。期待通りに動いてないだけで。
guest

回答3

6

ベストアンサー

関数 makeFunc を 呼び出した(makeFunc())結果が関数で、その関数を実行するには () を付けて呼び出す必要があります。ただ makeFunc(); と書いただけでは返ってきた関数を呼び出していません。

js

1var myFunc = makeFunc(); 2myFunc;

と書いても myFunc が実行されないのと同じことです。

変数に代入しない同等の書き方は、makeFunc()(); です。

投稿2022/08/07 23:48

編集2022/08/07 23:49
int32_t

総合スコア20122

miyabi_pudding, holly, recal, Zuishin, kei344👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2022/08/08 01:37

理解するのに大分苦労しましたが、スッキリしました。継続して勉強頑張りたいと思います!!
guest

3

makeFunc は関数を返す関数です。つまり ()を付けて makeFunc() とすると関数が返されます。やりたいことは、makeFunc() が返した関数を実行することなので、関数の返した値が関数であるときに限らず返された値を使いたいときに

javascript

1var myFunc = makeFunc();

として、いったん変数に入れて使おうとしています。makeFunc() が返すのは関数なので、それを使うというのは () を付けて、それを呼ぶということなので次に

javascript

1myFunc();

としています。
なお、関数の返した値をいったん変数に入れることをしないで、コードを削減することはよくあることですが、この場合も

javascript

1var myFunc = makeFunc(); 2myFunc();

の2行でやっていることを、中間の変数 myFunc にいったん入れておくということをせずに、1行で

javascript

1makeFunc()();

と書くこともできます。

補足ですが、Javascript の関数が関数を返すことのできる性質のことを「Javascriptの関数は第一級オブジェクトである」とか「Javascriptの関数は第一級関数である」と言ったりします。また makeFunc() のような関数を返す関数、あるいは関数を引数として取る関数のことを高階関数と言います。

投稿2022/08/08 00:00

退会済みユーザー

退会済みユーザー

総合スコア0

recal, kei344👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

0

それは、エラーというよりreturnの仕様ですね
returnの内容によると関数を返すという意味になるので
そのまま帰ってきてしまいます
もし、そのまま実行したいのであればこうしてみてください

js

1function makeFunc() { 2 var name = 'Mozilla'; 3 alert(name); 4} 5 6makeFunc();

追記
期待どおりに動かないのは
関数を実行する()をつけていないからです

投稿2022/08/07 23:43

編集2022/08/07 23:45
sgru-

総合スコア133

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

2022/08/08 01:41

こちらの回答が複数のユーザーから「過去の低評価」という指摘を受けました。

回答へのコメント

Zuishin

2022/08/07 23:48

クロージャの学習に使用されているサンプルコードと思われます。 高階関数でなくすのは本末転倒です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.60%

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

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

質問する

同じタグがついた質問を見る

JavaScript

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

クロージャ

クロージャは、プログラミング言語における関数オブジェクトの一種です。 引数以外の変数を実行時の環境ではなく、 自身が定義された環境において解決することを特徴とします。