読者です 読者をやめる 読者になる 読者になる

うさがにっき

読書感想文とプログラムのこと書いてきます

JavaScript入門書を読んで気になった点 その3

詳細

名前付き引数関数

こんな感じで関数の引数に名前をつけることができる

function triangle(args) {
  if(args.base == undefined) {
    args.base = 1;
  }
  if(args.height == undefined) {
    args.height = 1;
  }

  return args.base * args.height / 2;
}

triangle({height:4, base:5});

argsから引数を取り出し、入ってないなら定義するって感じで使う

高階関数

関数の引数に、関数を用いることもできる

function arrayWalk(data, f) {
  for(var key in data) {
    f(key, data[key]);
  }
}

var ary = [1, 2, 4, 8, 16];

arrayWalk(
  ary,
  function(key , value) {
    document.writeln(key + ':' + value);
  }
);

結果

0:1 1:2 2:4 3:8 4:16

クロージャ

関数内のローカル変数を保存する関数内関数のことをクロージャという
一言で言うと意味わからんなのでコードを読んでみる

function closure(init) {
  var counter = init;

  return function() {
    return ++counter;
  }
}

var myClosure = closure(1);
document.writeln(myClosure());
document.writeln(myClosure());
document.writeln(myClosure());

結果

2 3 4

counterはclosure内のローカル変数にもかかわらず、関数を呼ぶたびにきちんとインクリメントされている
それはclosure関数の返り値が匿名関数であることがポイント

通常、関数の中で使われたローカル変数は、関数の処理が終了した時点で破棄される
だが、closure関数から返された「匿名関数がローカル変数counterを参照し続けている」ため、closure関数の終了後もローカル変数counterは保持され続けるため

参考

JavaScript本格入門 ?モダンスタイルによる基礎からAjax・jQueryまで

JavaScript本格入門 ?モダンスタイルによる基礎からAjax・jQueryまで