Javascriptのfunction()でちょっと実験

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値が返されます。
ちなみに()()()とするとエラーになりました。すなわち、関数じゃないものに()をつけるとエラーになります。

 

 

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください