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

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

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

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

クロージャ

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

Q&A

解決済

2回答

1791閲覧

クロージャを使う必然性が分かりません

takubdm

総合スコア12

JavaScript

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

クロージャ

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

0グッド

1クリップ

投稿2017/05/24 05:46

クロージャが分からず調べていたところ、ソースコード1を見つけました。なぜcounter()を実行する度に値が変化するのか理解できずにいましたが、ソースコード2のように、オブジェクトcreateCounterがインスタンス化されたものと考えると、オブジェクト指向として考えて理解が出来ました。

分からないのが、ソースコード1もソースコード2も正しく動作し、同じ挙動をするように見受けられます。両者にはどのような違いがあるのでしょうか?

普段はオブジェクト指向でプログラミングしており、ソースコード2の方式を使っています。あえてソースコード1を使う必然性は何なのでしょうか?

###ソースコード1 - クロージャ

Javascript

1function createCounter() { 2 var n = 0; 3 return function() { 4 return n++; 5 }; 6} 7 8var counter = createCounter(); 9counter(); // 0が返される 10counter(); // 1が返される

###ソースコード2 - インスタンス化

Javascript

1function createCounter() { 2 var n = 0; 3 return function() { 4 return n++; 5 }; 6} 7 8var counter = new createCounter(); 9counter(); // 0が返される 10counter(); // 1が返される

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

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

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

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

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

Zuishin

2017/05/24 05:50

同じコードです。
think49

2017/05/24 05:57

私は「なぜインスタンス化すると理解できるのか」が分かりません。インスタンス化をしても this 値を参照しているわけでもなく、クロージャとしての実体は同じように読めます。もう少し、考えを整理して質問すると良いと思います。
akabee

2017/05/24 06:16

他の言語のプログラミング経験はそれなりにありますか?かなりエスパーしたアドバイスですが、JavaScriptの関数は第一級オブジェクトであるという特徴の理解が必要なのではないでしょうか?参考→http://maeharin.hatenablog.com/entry/20130308/javascript_function_ninjya
guest

回答2

0

いえ、1も2も全く同じ動作をするコードです。

newを付けて関数を実行しても、その中で何かをreturnしている場合、新たなオブジェクトではなく、returnに指定された返り値がそのまま返されます(MDN)。

コンストラクタ関数が返すオブジェクトが、new 式の結果になります。

投稿2017/05/24 06:07

maisumakun

総合スコア145184

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

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

0

ベストアンサー

両者の動作は同じ

両者のコードの動作は同じです。
「ソースコード2」ではインスタンスを生成していますが、this 値を参照していない為、「ソースコード1」と同じ原理でクロージャ内に閉じ込められた変数 n を利用する動作になっています。
takubdm さんはソースコード1を使う必然性に疑問を持っておられるようですが、逆にソースコード2を使う必然性がありません。

new 演算子を利用したコード例

new 演算子を利用したコードは例えば、次のようなものです。

JavaScript

1function Counter () { 2 this.number = 0; 3} 4Counter.prototype.increment = function increment () { 5 return this.number++; 6} 7 8var counter = new Counter; 9console.log(counter.increment()); // 0 10console.log(counter.increment()); // 1

このコードは counter.number によって数値を直接改変する事が可能ですが、クロージャの手法であれば改変されるリスクがなくなります。
それがクロージャの利点です。

Re: takubdm さん

投稿2017/05/24 06:15

編集2017/05/24 06:16
think49

総合スコア18162

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問