20150418 - kyosen/javascript-ninja GitHub Wiki

第3章 関数が肝心

3.1 JavaScriptの関数は、どこが違うのか

3.2 関数の宣言

  • p45 一番したのメモに「メモ関数」とあるが。(米田:Kindle版)

    • 本では、「メモ関数」ではなく「関数」。
  • p48 リスト3-2 の「var c = 3」をif文の前にも記述している場合、どのように動作するのか?(乙村)

    • エラーにならず、後で定義したもので上書きされる。use strict を用いても同様。(米田)
  • 変数自体も関数と同様に関数の最初に定義されているように動作するという記述がある文献もあるが。(辻)

    • https://developer.mozilla.org/en-US/docs/Glossary/Hoisting
    • でも実際の動作は異なるということか?
      • 変数定義は関数の先頭で行われるが、初期化はコードが記述されたタイミングで行われる。p50 図3-6 のスコープは厳密には間違い。
      • だから、変数定義は関数の先頭で行うのが望ましい。
// c の定義は関数の先頭に巻き上げられる。その際、undefinedになる。
// ログにはundefinedが表示される。
function foo(){
  console.log(c);
  var c = 5;
}
// cが定義されていないので、コンパイルエラーとなる。
function foo(){
  console.log(c);
}

3.3 関数の呼び出し

  • p57 「この最後のポイントが、creep()がコンストラクタとして不適格な理由である」とあるが、new creep() の場合、作成したオブジェクトをreturn this で返却するので、コンストラクタとして正しい動作になるのでは?(辻)
    • creep() 関数が作成するオブジェクトに対して何も設定していないので、意味がないと言っているのでは?

第4章 関数を使いこなす

4.1 無名関数

  • なし

4.2 再帰

  • リスト4-5 Kindle版では4-6と同一のコードになっている(米田)
    • リスト4-5はWebからダウンロードして確認。

4.3 オブジェクトとしての関数

  • リスト4-8 において登録する関数を書き換えている。関数にidプロパティが既にある場合は、書き換えらえてしまう。(辻)

  • リスト4-9 は一度計算した値をキャッシュしているが、以降参照されないデータがあった場合、キャッシュするのはメモリの無駄では?(乙村)

    • キャッシュ一般に言える話では(伊藤)。
  • リスト4-9 キャッシュするような関数を作るのであれば、関数オブジェクトではなく、オブジェクト(キャッシュフィールドと素数計算メソッドを持ったもの)を作った方が理解しやすいのでは?(米田)

    • 素数かどうかだけを求めたい場合は、冗長な構成だと思う(井谷)
  • リスト4-10 Array.prototype.push の中で length が使われていることを理解しているからうまく動作しているが、 内部実装を知らない他の Array のメソッドを用いた際には、適切に動作する保証がないような使い方だと思われる(井谷)

4.4 可変長引数リスト

  • リスト4-16 このようなやり方でオーバーロードしなければならないケースが思いつかない(乙村)

    • JavaScript 自体にそのようなことが必要なのか?
    • オーバーロードをするとして、このようなaddMethod()のような仕組みを使うのか?
  • リスト4-16 で引数が3つの場合は、nullが返ってくるのか?(伊藤)

    • undefined が返る。assert では、null と == なので、true になる。

4.5 関数かどうかをチェックする

  • なし(第11章で深く確認)