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

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

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

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

Q&A

解決済

4回答

1141閲覧

JavaScript 即時関数

..o

総合スコア28

JavaScript

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

0グッド

0クリップ

投稿2020/08/05 02:25

編集2020/08/05 04:14

前提

お世話になっております。
即時関数について学んでいる際、例題のコードの流れがわからなかった為質問させていただきます。

javascript

1let c = (function() { 2 3 console.log('called');//called 4 5 let privateVal = 0; 6 let publicVal = 10; 7 8 function privateFn() { 9 console.log('privateFn is called'); 10 } 11 function publicFn() { 12 console.log('publicFn is called: ' + privateVal++); 13 } 14 15 return { 16 publicVal, 17 publicFn 18 }; 19})() 20 21c.publicFn();//publicFn is called: 0 22c.publicFn();//publicFn is called: 1 23c.publicFn();//publicFn is called: 2 24c.publicFn();//publicFn is called: 3 25 26console.log(c.publicVal);//10

質問

c.publicFn();の一つ目の実行で何故 publicFn is called: 0 が出力されるのか
わかりません。

function publicFn() {
console.log('publicFn is called: ' + privateVal++);
}
の記述で1が加算されているのに何故0なのでしょうか。//後置演算ということが抜けておりました。ありがとうございます。

またc.publicFn(); を呼び出すたびに加算される仕組みが、理解できません。

自分がどういった流れで理解しているかまとめますので少々お待ちください。申し訳ございません。

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

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

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

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

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

hentaiman

2020/08/05 04:10

クロージャーがどういうものか調べた方が良いかな、即時関数は関係ないです
..o

2020/08/05 04:23

勉強している項目名をそのままタイトルに記載したため分かりにくくなりました。 ありがとうございます。
guest

回答4

0

1が加算されているのに何故0なのでしょうか。

それが後置++演算子の動作です。変数に1を足しますが、使われた式の中では足す前の値となります。

投稿2020/08/05 02:33

maisumakun

総合スコア146018

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

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

..o

2020/08/05 02:43

前置演算、後置演算について抜けておりました。ご回答ありがとうございます。
guest

0

1が加算されているのに何故0なのでしょうか

後置インクリメントは、加算前の値を返します。

前置と後置 - 演算子 - JavaScript入門


即時関数でreturnした値publicFn(1加算されたもの)がcに代入される(都度c.publicFn内のpublicValのみが加算され記録される)為

呼び出すたびに1加算できる、ということなのでしょうか?

うーん。。。おっしゃることがよくわかりません。

「returnした値publicFn(1加算されたもの)」とありますが、publicFnは関数なので、「1加算されたもの」という言い方はしっくりきません。「1加算するもの」という意味でしょうか?

「都度c.publicFn内のpublicValのみが加算され記録される」とありますが、これは「privateValのみが加算され」の間違いでしょうか?

投稿2020/08/05 02:42

Lhankor_Mhy

総合スコア36960

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

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

..o

2020/08/05 03:19

ご回答ありがとうございます。 後置演算、前置演算について抜けていました。 >「returnした値publicFn(1加算されたもの)」とありますが、publicFnは関数なので、「1加算されたもの」という言い方はしっくりきません。「1加算するもの」という意味でしょうか? privateValに1加算したものを出力するというpublicFn関数 というつもりで言っていましたが、 後置演算である為、式自体では加算されていない というのが現状の理解です。 >「都度c.publicFn内のpublicValのみが加算され記録される」とありますが、これは「privateValのみが加算され」の間違いでしょうか? 流れが理解できていない為おかしなことを言っていると思うんですが、 c.publicFn(); を呼び出すたびに加算される仕組みが、理解できていません。 自分の中では何度呼び出しても同じ出力結果になるのではないかと考えておりました。 自分で考えていた流れがわからなくなってきた為、度整理させてください。すいません。
maisumakun

2020/08/05 03:23

> 自分の中では何度呼び出しても同じ出力結果になるのではないか どのようなロジックでそう考えましたか?(どこかが実際とは違うということです)
Lhankor_Mhy

2020/08/05 03:29

>..momokaさん クロージャについて、どの程度の知識がありますか?
Lhankor_Mhy

2020/08/05 03:43

>式自体では加算されていない というのが現状の理解 それは適切な理解ではありません。式が評価されることによって、加算されます。 語弊があるかもしれませんが、言わば、副作用です。 alert('test')を評価しても 'test' が戻らないからと言って、「alert関数自体ではアラートダイアログを表示しない」とは言いませんよね? 同様に、i++ を評価しても i+1 が戻らないからと言って、「後置インクリメント演算子自体では加算をしない」と表現するのは、あまり適切ではないと思います。
..o

2020/08/05 04:25

式というかconsole.logの記述内自体では、ですねご指摘ありがとうございます。
guest

0

自己解決

インクリメントについての理解とクロージャの初期化の動きについて調べなおしたところ理解に至りましたので解決とさせていただきます。
回答いただいた皆様ありがとうございました。

投稿2020/08/05 04:19

..o

総合スコア28

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

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

0

質問のポイントがよく理解できませんが、挙動がわからないのであれば、わかるようにすればよいです。
一般的にはデバッグ環境を整えて動かすのですが、簡易的に以下の様なオンラインツールを使用してもよいです。

http://pythontutor.com/visualize.html

投稿2020/08/05 03:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/08/05 03:32

即時関数 レキシカルスコープとどう関係しているんだろう。。。分らん。
..o

2020/08/05 04:21

ツールのご紹介ありがとうございます。参考にいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問