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

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

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

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

Q&A

解決済

4回答

262閲覧

javascriptのスコープ

kirokira

総合スコア13

JavaScript

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

1グッド

1クリップ

投稿2019/02/08 18:13

javascript

1let setUp = () => { 2 let count = 0; 3 return () => { 4 return count += 1; 5 } 6}; 7console.log(setUp()); //1 8console.log(setUp()); //1 9console.log(setUp()); //1 10let next = setUp(); 11console.log(next()); //1 12console.log(next()); //2 13console.log(next()); //3

上記のようなコードがあったとします。
なぜ変数nextに入れるとcountに値が保存されるのでしょうか?
next()を呼び出すごとにcountの値が更新される理由がわかりません。おそらくスコープが関係しているとは思うのですが…
初歩的な質問で申し訳ありません。回答よろしくお願い致します。

Lhankor_Mhy👍を押しています

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

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

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

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

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

Lhankor_Mhy

2019/02/09 07:20

console.log(setUp()); //1 当方の環境では、1 ではなく関数が返って来ました。おそらくコードの転記ミスかと思いますので、ご確認ください。
guest

回答4

0

関数を呼び出すと、その関数のローカル変数が新たに作り出されると言うことは分かりますでしょうか?

前半は、console.logを呼び出す毎回、setupを呼んでいるので、毎回countという変数が新たに生成され、初期値0+1されて1が帰ります。

後半は、nextへの代入の時点でsetupが呼ばれているのでこのときにcountが生成され、以降はその1つのcountが毎回使われるので、+1される度に値が増えていきます。

投稿2019/02/09 00:09

otn

総合スコア84491

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

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

0

JavaScript クロージャ」で検索してわかりやすい記事を探すとかどうでしょう。


【JavaScriptでクロージャー - Qiita】
https://qiita.com/asaori/items/144e792404c70fc3540a

【【JavaScript入門】クロージャって一体何?使い方まで徹底解説 | 侍エンジニア塾ブログ | プログラミング入門者向け学習情報サイト】
https://www.sejuku.net/blog/25026

【クロージャ - JavaScript | MDN】
https://developer.mozilla.org/ja/docs/Web/JavaScript/Closures

【関数を理解すればクロージャは難しくない!|もっこりJavaScript|ANALOGIC(アナロジック)】
http://analogic.jp/closure/

【JavaScriptのクロージャは内部でどう機能するのか | POSTD】
https://postd.cc/how-do-javascript-closures-work-under-the-hood/

投稿2019/02/08 18:20

kei344

総合スコア69398

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

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

0

ベストアンサー

クロージャ

大抵は「クロージャ」という言葉で説明されますが、「なぜその動作になるのか」をクロージャで説明するのは難しいと思います。
私は「スコープチェーン」と「ガベージコレクション」から原理を理解しました。

スコープチェーン

ガベージコレクション

Re: kirokira さん

投稿2019/02/09 05:33

編集2019/02/09 05:33
think49

総合スコア18162

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

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

miyabi_takatsuk

2019/02/09 16:08

横槍失礼します。 リンク先での、ガベレージコレクションのご説明、大変にわかりやすかったです。 私もよくわからないで使ってたため、 メモリの無駄遣いな書き方をしてしまっていたと反省しました。
kirokira

2019/02/10 17:10

ありがとうございました!どういった仕組みなのか理解することが出来ました!
guest

0

スコープと高階関数についてはご理解されているご様子ですから、それほど難しく考える必要はないと思います。

js

1 console.log( setUp() === setUp() ); //false 2 let next = setUp(); 3 console.log( next === next ); //true

見ているものが違うものなのか、同じものなのか、の違いです。

投稿2019/02/09 07:46

Lhankor_Mhy

総合スコア36057

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問