LoginSignup
4
5

More than 5 years have passed since last update.

超初心者 JavaScript エンジン 的呼ばれ方を理解してコーディングするメモ

Posted at

初めに

  • プログラマ歴に比べると、超JS初心者
  • メモなので、間違っている箇所、誤字脱字の可能性があります
  • どんな言語でもそうですが、感覚の違いというのは誰しも有ります

jsのデバッグ

をしているとわかることだけれど

昔からコンテキストスイッチ

という物があり、これは、実行しているプロセスをしまっておいて、必要になった時に出してきて継続した処理を正常に動かしておくもの。

jsで言えば

例えば、スパイダーモンキーとかV8のようなエンジンが変数などの初期化の際、その実行コンテキストのオブジェクトに変数や関数の初期化されたもの等をしまっておく。
ただ、ここで気を付けておきたいことが、変数・関数の宣言・初期化処理は行うが、関数の中に存在するローカル変数に関しては宣言に留まり、初期化までは行わないということ。当然の話だけど、理解して書いていないと思わぬundefinedを引き起こしてしまう可能性がある。

サンプルコードを書いてみた。
magicという隠し味をミックスした物を生み出すコードです。内容はどうでもいいですが

function make(val) {
  var name = name,
      magic = '';
  function mixin() {
    console.log(magic + name);
  }
  mixin();
}
make('ジュース');

make関数にブレークポイントを置いてみると
コードの実行が行われるまでは、make関数の中にあるname,magicのような変数は初期化されておらずundefinedされている。mixinのスコープのクロージャとしてもまだ初期化はされておらず

スクリーンショット 2015-08-18 13.09.13.png

その後、make関数の中にステップインすると
name,magic変数が初期化され、それぞれの値が代入されているます。クロージャとしても値が入っている

スクリーンショット 2015-08-18 13.12.20.png

この後は、引き続きVMの中に入っていってconsoleが呼ばれnameとmagicの合わさった文字が出力される

何こいつ当たり前のことを言っているんだ、てなるかもしれませんが。まあ、そう、本当に当たり前の話で。

実際に関数が呼ばれるまでは関数内にある変数は初期化されてないよ、という超初心者向けの記事なので。サーバサイド中心にやっていて、バグらない程度に一応JSの動き知っておこうって人のための記事です。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5