若手IT勉強会 第5回勉強会 サイ本読書会 第8章

第5回勉強会 - 若手IT勉強会 - アットウィキ
↓を使ってコードの実行デモをやった。
Learning Advanced JavaScript

8.1.1 入れ子型の関数

  • 関数の中で関数を定義出来る
  • 関数の定義はそのスコープ内のトップレベルで行わなければならない
    • if文の中で関数定義とかは駄目
  • 関数リテラルはどこで定義しても良い

8.2.2 Argumentsオブジェクト

  • arguments.length : 実引数の個数
  • Argumentsオブジェクトは配列風オブジェクトだが配列ではない
  • argumentsは予約語ではないので変数名等として使用出来る
    • Argumentsオブジェクトへの参照が見えなくなる
  • arguments.callee : 現在実行中の関数。再帰呼び出しのときに使う。

8.4 メソッドとしての関数

  • thisキーワード : その関数がどのオブジェクトのメソッドとして呼ばれたか
  • 関数として呼ばれた場合にはthisはグローバル
  • キーワードなので値を代入出来ない

8.6.1 (関数の)lengthプロパティ

  • lengthプロパティ(arguments.callee.length) : 関数の仮引数の個数

8.8.2 Callオブジェクト

  • argumentsとローカル変数はCallオブジェクトのプロパティ

8.8.4.1 クロージャの例

クロージャによるデータ隠蔽
ブレークポイントシステム
alert(factorial(3));
function factorial(n){
  var inspector = function($){return eval($);};
  inspect(inspector,'Entering factorial()');
  var result = 1;
  while(n > 1){
    result = result * n;
    n--;
    inspect(inspector,'factorial() loop');
  }
  inspect(inspector,'Exiting factorial()');
  return result;
}

function inspect(inspector,title){
  var expression,result;
  while(true){
    var message = (title || '') + ','
      + 'result:' + (result || '');
    expression = prompt(message,expression);
    if(!expression)return;
    result = inspector(expression);
  }
}

8.9 Function()コンストラク

window.a = 0;
(function(){
  var a = 1;
  var f = function(){log(a);};
  var g = new Function('x','log(a);');
  f();
  g();
})();
//   1. LOG 1
//   2. LOG 0
  • ループ等の中で使われた場合、毎回コンパイルされて新しい関数オブジェクトを生成する
    • 関数リテラルの場合は新しい関数オブジェクトを生成する訳ではない