専門書の誤植かもしれないですが文法が分かりません。
「HTML5プロフェッショナル認定試験レベル2
スピードマスター問題集 P77」より。
function myCatName() { var catName = "Lum"; function closure() { return catName; } return closure; } var test = myCatName(); console.log(test()); // Lumと表示される
最後の「cosole.log(test());」は正しくは「cosole.log(test(););」ではないのでしょうか?
(追記)
クロージャではなく、関数の引数に別の関数を渡す文法が理解出来てませんでした。
javascriptはコールバック関数・クロージャなどややこしいのでもう少し復習してみます。
最後の二行、testなのかtextなのかをはっきりさせましょう。
申し訳ありません。
編集します。
> 最後の「cosole.log(test());」は正しくは「cosole.log(test(););」ではないのでしょうか?
なぜそれが正しいと思ったんでしょうか?
セミコロンはどういうときに使うと認識していますか?
Zuishin様
返信ありがとうございます。
ご指摘の通りセミコロン自体を二重に記述すること自体がそもそもの間違いでした。
javascriptは文法が複雑過ぎて少し頭が混乱してました。
> クロージャではなく、関数の引数に別の関数を渡す文法が理解出来てませんでした。
関数の引数に別の関数を渡していません。
関数の戻り値として返された関数を実行し、その戻り値を console.log に渡しているだけです。
クロージャを雑に言うと、戻り値として関数を返す関数です。
myCatName の戻り値は closure 関数なので、
> var test = myCatName();
これで test は closure 関数になります。したがって、test() のように呼び出すことができ、それは closure() と呼びだしたのと同じです。test と closure は同じなので、その戻り値は closure 関数を見ればわかるとおり catName になります。console.log に渡されているのは、closure() の戻り値である catName つまり Lum になります。
文末ではないのに;をつけたらいけないでしょ…
Zuishin様
詳細なアドバイスをありがとうございます。
なるほど、関数を返していたわけですね。
内と外が入り組んでいて理解するのが難しかったです。
回答1件
あなたの回答
tips
プレビュー