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