Jun's blog

仕事や趣味について綴ります

JavaScript言語仕様メモ

普段の仕事でゴリゴリ素のJavaScriptを書くというのはあまり無い(jQueryを使う方が多い)のですが、
ある程度JavaScriptの言語仕様についてきちんと理解しておいたほうが良いと思い復習・学習したことを備忘も兼ねてメモ。

  • varが無い変数は全てグローバル変数
  • ブロック({})レベルのスコープは存在しない
  • 関数の定義方法は以下の3つ
  • argumentsオブジェクトが引数の情報を管理する(実はargumentsプロパティはCallオブジェクトのプロパティ。)
  • Callオブジェクトは関数が呼び出される度に都度自動で内部的に作られるオブジェクト。
  • ローカル変数もこのCallオブジェクトのプロパティ。
  • クラスは無い。プロトタイプ(雛形)いう概念だけが存在。
    • プロトタイプとはあるオブジェクトの元となるオブジェクトの事。
  • コンストラクタでのメソッド追加は「メソッドの数に比例して無駄なメモリを消費する」問題がある
    • 同じ処理なのにインスタンスの数分メソッドが作られる(コピーされる)。
    • 解決策として、prototypeプロパティ(デフォルトでは空のオブジェクト)にメソッドを追加する。
    • prototypeプロパティを使用すると以下のメリットがある
      • メモリ使用量節減
      • プロトタイプへのメンバの追加・変更をインスタンス側がリアルタイムに認識できる(インスタンスはプロトタイプへの暗黙の参照を持っているため)
  • インスタンス毎に異なる値を持つプロパティをプロトタイプで宣言する意味は無いので以下のように使い分けること。
  • 静的プロパティ・メソッドインスタンス経由では呼び出せない。(関数オブジェクトに追加されたメンバであるため)
  • 静的プロパティは基本的に読み取り専用にすべき(変更した場合の影響範囲が大きいため)
  • インスタンスに定義されていないメソッドはプロトタイプオブジェクトを辿って呼び出される⇒プロトタイプチェーン(終端はObject.prototype)
  • クロージャとは「ローカル変数を参照している関数内関数」
  • クロージャとオブジェクトの使い分け
    • 変数(群)に伴う処理をひとつしか必要としない → クロージヤ
    • 複数の処理を必要とするケース → オブジェクト