javascriptのクロージャの例として下記のような例があります
function outer(){
var x = 1;
return function (){
console.log(x);
x = x + 1;
};
}
hoge=outer();
hoge(); //1
hoge(); //2
hoge(); //3
変数hogeに関数outerを代入し、hoge()を1回目に実行したときに「1」が返ってくるのは理解できます。
しかし、2回目以降にhoge()を実行したときに、カウントアップしたxが返ってくるのがわかりません
2回目以降の呼び出しの際にouter関数内のvar x = 1は実行されないのでしょうか?
No.3ベストアンサー
- 回答日時:
-- hoge=outer();
関数 outer が実行される
outer の関数スコープに変数 x を用意 ... 1
変数 x を閉包(closure)する関数 inner(仮称) を作成
関数 outer が実行終了
outer の関数スコープは破棄されるが、
変数 x だけは関数 inner に閉包されたので存続
-- hoge(); //1
関数 inner が実行される
関数 inner に閉包された変数 x を出力 ... 1
関数 inner に閉包された変数 x を加算 ... 2
関数 inner が実行終了
閉包された変数 x は関数 inner が存在するため存続
-- hoge(); //2
関数 inner が実行される
関数 inner に閉包された変数 x を出力 ... 2
関数 inner に閉包された変数 x を加算 ... 3
関数 inner が実行終了
閉包された変数 x は関数 inner が存在するため存続
No.2
- 回答日時:
hogeにはouterが生成した関数が代入されます。
以後、hogeの呼び出しは生成された関数を実行するだけ。
outerは実行されません。
outerの呼び出しは一回だけです。
No.1
- 回答日時:
こんばんは
>2回目以降の呼び出しの際にouter関数内のvar x = 1は実行されないのでしょうか?
されません。
hoge の内容は、outerから返される無名関数です。
その内容には
var x = 1;
は含まれていませんよね?
例えば、 console.log(hoge); としてみれば、
ƒ (){
console.log(x);
x = x + 1;
}
のような関数が返されることからも、確認できると思います。
hoge() を実行すれば、当然ながら上記の関数が呼ばれることになります。
変数 x は、定義された際にhogeのスコープにありますが、その後、hoge が実行される毎にインクリメントされてゆきます。
このような x が内包されるしくみを、クロージャと言うようです。
更に、別の変数として、
fuga = outer();
fuga();
fuga();
などとすれば、outer が呼ばれた際に、fuga 内の変数 x は1に初期化されます。
(hoge内のxには影響しません)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- XML XML同じ名前の要素を自動で集約するツール 1 2022/04/11 09:21
- JavaScript JavaScriptで「〇以上▲まで」の書き方 1 2022/07/20 14:44
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- HTML・CSS 全部のアクセスを指定したページに転送させたい 2 2022/06/28 16:33
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
- JavaScript ifreamをリロードしたい 1 2022/05/03 16:15
- JavaScript JavaScriptの即時関数の書き方 1 2022/11/29 09:52
- PHP PHPを使って、別サイトの一部を取得して表示したいのです。。 1 2023/01/18 21:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vb.netのグローバル変数の宣言...
-
【正規表現】【javascript】CR...
-
hoge の謎
-
Linux バイナリ実行できない "...
-
「オブジェクトが必要です。」...
-
C# .NET DataGridView の行を追...
-
ASP+アクセスでのSQLコメントに...
-
static と externについて
-
static constメンバ変数(配列)...
-
【Jquery】changeイベント毎にa...
-
ボタンをクリックすると数が増...
-
『名前空間』の意味を教えてく...
-
プログラムの関数の例でよく使...
-
同じIDで定義した要素の配列を...
-
<a>タグのテキストを取得
-
C#OpenCv V4にのエラーに関する...
-
GASでundefinedエラーが出ます
-
C#テキストボックスの文字を配...
-
window.openでタイトル名の指定
-
ActiveXobjectが作成できない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Boolean型配列中のTrueの有無を...
-
Linux バイナリ実行できない "...
-
ASP+アクセスでのSQLコメントに...
-
「オブジェクトが必要です。」...
-
Excel VBA の ChangeFileAccess
-
static constメンバ変数(配列)...
-
【Jquery】changeイベント毎にa...
-
HTTPSのとき":"が"%3A"ではなく...
-
【正規表現】【javascript】CR...
-
C# .NET DataGridView の行を追...
-
サブウインドウから親ウインド...
-
Vb.netのグローバル変数の宣言...
-
ボタンをクリックすると数が増...
-
MFCのキャプション変更
-
Perlから送信するメールのヘッ...
-
正規表現で半角数字1桁のみを全...
-
Imageコントロール vba
-
Option Strictと構造体とArrayL...
-
関数を呼び出すHTMLタグ<body o...
-
onclick指定関数の引数へローカ...
おすすめ情報