by shigemk2

当面は技術的なことしか書かない

JavaScript Ninjaの極意 3 関数が肝心

JavaScriptは関数がファーストクラスのオブジェクトである。
つまり関数は、ほかのすべてのJavaScriptオブジェクトと共存し、それらと同様に扱われる。
JavaScriptの、より一般的なデータ型と同じように、関数も、変数によって参照することが出来、
リテラルで宣言することが出来、引数として関数に渡すことさえ可能だ。

JavaScriptの関数的な性質が重要なのは、関数が主な実行の単位(モジュール)であるからだ。

JavaScriptのオブジェクトには、次の能力がある。

  • リテラルを介して作成できる
  • 変数や、配列のエントリや、他のオブジェクトのプロパティに代入できる
  • 引数として関数に渡すことが出来る
  • 関数から値として渡すことが出来る
  • 動的に作成して代入することが可能なプロパティを持つことが出来る


JSでは、関数リテラルを使って関数を宣言する。
関数リテラルは、4つの部分で構成される。

  1. functionキーワード
  2. オプションの名前。指定する場合は、JavaScripの識別子として有効な名前であること
  3. カッコで囲まれ、コンマで区切られたパラメータ名のリスト。名前は有効な識別子であること。リストは空でもよい。カッコは必ず必要である
  4. 関数の本体は、空でもいいけど波かっこは必ず必要である
<!DOCTYPE html>
<html>
  <head>
    <title>Listing 3.1</title>
    <script type="text/javascript" src="../scripts/assert.js"></script>
    <link href="../styles/assert.css" rel="stylesheet" type="text/css">
  </head>
  <body>
    <script type="text/javascript">

      function isNimble(){ return true; }                            //#1

      assert(typeof window.isNimble === "function",                  //#2
            "isNimble()は定義されている");
      assert(isNimble.name === "isNimble",
            "isNimble()には名前がある");


      var canFly = function(){ return true; };                       //#3

      assert(typeof window.canFly === "function",                    //#4
             "canFly()は定義されている");
      assert(canFly.name === "",
             "canFly()には名前がない");


      window.isDeadly = function(){ return true; };                  //#5

      assert(typeof window.isDeadly === "function",                  //#6
             "isDeadly()は定義されている");

      function outer(){                                              //#7
        assert(typeof inner === "function",
               "inner()は宣言の前にスコープに入っている");
        function inner(){}
        assert(typeof inner === "function",
              "inner()は宣言の後にスコープに入っている");
        assert(window.inner === undefined,
               "inner()はグローバルスコープに入っていない");
      }

      outer();                                                       //#8
      assert(window.inner === undefined,
             "inner()は、まだグローバルスコープに入っていない");

      window.wieldsSword = function swingsSword() { return true; };  //#9

      assert(window.wieldsSword.name === 'swingsSword',
             "wieldSwordの本当の名前はswingsSword");

    </script>
  </body>
</html>