javascriptのfunction()とreturn値について、ちょっと実験。()をつけたりつけなかったりで、return値がどうなるのか実験しました。
そもそものなぜ実験したのか
こんなコードを発見しました。関数定義のコードの最後に();がついてますが、必要性がいまいちわかりませんでした。
var getCode = (function(){ var secureCode = "0]Eal(eh&2"; // 外部の関数が変更できないようにしたいコード return function () { return secureCode; }; })();
最後の「()」がなぜ必要なのか?と言うことで、関数の最後に()をつけるとreturn値がどう変化するのか実験しました。
実験に使ったコード
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>function test</title> </head> <body> <script> console.log("function test"); var getCode = (function(){ var secureCode = "0]Eal(eh&2"; // 外部の関数が変更できないようにしたいコード return function () { return secureCode; }; }); // ()無しで実験用コードを記載 // シークレットコードを返す console.log("0:", getCode); console.log("1:", getCode()); console.log("2:", getCode()()); //console.log("3:", getCode()()()); error </script> </body> </html>
出力結果
ブラウザの開発者コンソールの出力結果です。
0:は、getcode変数の中味を出力。コメント、改行位置も含めて、変数に代入した文字列がそのまま出力されてます。
1:getcode()として出力。()をつけました。関数内(外部関数内)で定義した関数(内部関数の定義)がそのまま出力されています。ここでは外部関数のreturn値が返ってきてます。
2:getcode()()として出力。()()をつけました。期待するreturn値になってます。return値で返ってきた関数のその又return値になってます。ここでは内部関数のreturn値が返ってきています。
function test 0: ƒ (){ var secureCode = "0]Eal(eh&2"; // 外部の関数が変更できないようにしたいコード return function () { return secureCode; }; } 1: ƒ () { return secureCode; } 2: 0]Eal(eh&2
ようするに、()を書くと、returnに書かれた内容を返すと言うことです。当たり前ですね。
()をつけるとreturnに書かれた内容が返される、
()()とするとreturnに書かれた内容の(関数)のrerurn値が返されます。
ちなみに()()()とするとエラーになりました。すなわち、関数じゃないものに()をつけるとエラーになります。