こんにちは。
JavaScriptの解説サイト: クロージャーがなぜ動くのか のクロージャの説明部分で以下のコードがあるのですが、コメントの「increment
関数は外のスコープの変数count
を参照している」で、なぜ"関数"が"変数"を参照できるという仕組みがあるのか分からないです。関数が変数を参照するということなど今まで見たことがないのですが、、、変数が値を参照するという仕組みがあることなら知っていますが、、、
JavaScript
1const createCounter = () => { 2 let count = 0; 3 return function increment() { 4 // `increment`関数は外のスコープの変数`count`を参照している 5 // これがクロージャーと呼ばれる 6 count = count + 1; 7 return count; 8 }; 9}; 10// createCounter()の実行結果は、内側で定義されていた`increment`関数 11const myCounter = createCounter(); 12// myCounter関数の実行結果は`count`の評価結果 13console.log(myCounter()); // => 1 14console.log(myCounter()); // => 2
よろしくお願い致します。
なにかおかしいところがありますか?
私は、変数は値を直接持たず、値が格納されているメモリ上のアドレスを持つと思っています。そして、変数を参照するとは、アドレスを用いて値にアクセスすることだと思っています。
そこで、関数自体が、上記の"変数のアドレス"を持つ(関数が変数を持つ)ということが、ありえないことだと思っています。
関数内で変数が宣言されているので当然かと思いますが(メモリ云々よりスコープの問題)
というか、これを突き詰めても何もならないと思いますが。別の言語と混同してませんか?
言い方が良くありませんでした。increment関数がcountを参照しているのではなくて、increment関数内の"count"が外のスコープの変数countを参照しているのではないか、という疑問です。
"リンク内容"
アンカーテキストはリンク先を表す具体的な名前にしてください。
https://www.smbc.co.jp/accessibility/guidelines/guideline_38.html
ご指摘ありがとうございます。修正致します。
「参照している」という言葉に引っかかったようですが、これは正式な用語ではなく、その資料の筆者が勝手に使っているだけです。「その関数を含むスコープの中にある」とか、あるいはmaisumakunさんの説明の枠組みで言うなら「その関数が持っている環境に含まれている」とか解釈しておけばいいと思います。回答に仕上げる気力がないのでコメントにした。
「参照している」はガベージコレクションによるメモリ管理で使われる事があります。関数が変数を参照していると、その変数はガベージコレクションの開放対象とならず、メモリを占有し続けます。
今気付いたのですが、関数が変数を参照するとは、関数が変数名を参照していることであって、変数に代入されている値、を格納しているメモリの住所を参照している訳でないということなのでしょうか。
変数名。まあ近いですが、変数名が同じでもスコープが違えば「参照」できませんので、名前でもメモリの番地でもなく抽象的な「変数そのもの」ということになると思います。
>think49さん
そうですね。ただここは文脈が違うと思います。
了解しました。返信有難うございました。
そもそも、関数はレキシカル?的にその中にある変数を、自分の関数の中に変数と認識しているんですね。
変数の方が、自分は関数の中で定義されていると認識していて、関数の方は含んでいる変数を認識していないものだと思っていました。
回答3件
あなたの回答
tips
プレビュー