JavaScript勉強メモ

巻き上げ

  • 以下は「undefined」が出力される。
var hoge = 'hoge';
function func() {
  console.log(hoge); // 「undefined」
  var hoge; // ←こいつのせい
}
func();

JavaScriptエンジンは、コードを2回搜査する。

  • 最初の搜査では変数を初期化する。
    • 関数引数(arg)の宣言+初期化。
    • ローカル変数(var)の宣言。初期化はしない
    • 関数(function)の宣言+初期化。
  • 2回めの搜査でコードを実行する。
    • このときに、ローカル変数に値を割り当てていく。

オブジェクトのインスタンス

new を使う方法
var hogeProto = { // プロトタイプオブジェクト
  foo : 4,
  bar : 2
};

var Hoge = function(name, id) { // オブジェクトコンストラクタ
  this.name = name;
  this.id = id;
};

Hoge.prototype = hogeProto; // コンストラクタをプロトタイプに関連付ける

var firstHoge = new Hoge('Hoge1', '1A'); // インスタンス化
var secondHoge = new Hoge('Hoge2', '2B');
Object.create を使う方法
var hogeProto = { // プロトタイプオブジェクト
  foo : 4,
  bar : 2
};

var makeHoge = function(name, id) { // ファクトリ関数
  var hoge = Object.create(hogeProto);
  hoge.name = name;
  hoge.id = id;
  return hoge;
};

var firstHoge = makeHoge('Hoge1', '1A'); // インスタンス化
var secondHoge = makeHoge('Hoge2', '2B');

クロージャ

  • ガベージコレクションせんといてや」機構。
  • 変数を「実行コンテキスト外からアクセスできるようにしておく」ことで実現する。
    • 換言すると、「現在の実行コンテキスト外からの、その変数への動的アクセスを伴う関数を格納する」ことで実現する。
    • クロージャが作成される条件は:
      • その関数が、(単に数値や文字列ではなく、)複雑な構造(関数・オブジェクト・配列など)を返す。
      • その関数の戻り値を、(呼び出し側が)変数に格納して保持する。