Javascriptの基本:代入式

自分の足元を見直すつもりで、Javascriptに関して、いくつかの実験をしてみようと思う。まずは、代入式について考えてみたい。

まず、代入式は、

モリー空間にアロケートされた右辺の参照アドレスを、左辺でラベル付けする … (a)

と定義するのが一般的と思う。このとき、そのラベルを「変数」と呼ぶ。

この「変数」をプログラム内で参照した場合、それが

  1. 右辺の結果
  2. 右辺の参照(アドレス:以後、「参照」と略す)

のいずれかを表すかは言語体系で異なっている。基本的な演算上は両者は同じ結果をもたらすが、比較演算などでは異なった振る舞いをする。javaオブジェクトは、後者の立場をとっている(参照型)が、これは

「オブジェクトの比較とは何か?」という問いが自明な解を持たない

ことと無関係ではない。

話がわき道にそれてしまったが、それでは、Javascriptでちょっと実験してみる。

たとえば、なにげなく以下のようなコードを書いたとする。

var test = function(){ // --(2)

    var _arr = ["pretty","print"];
    return _arr;

};

var v1 = test; // --- (1)

ここで、prettyPrint.jsでv1をダンプすると、以下のようになって、(a)を裏付ける。


さて、ここで、(1)を以下のように書き換えたとする。

var test = function(){ // --(2)

    var _arr = ["pretty","print"];
    return _arr;

};

var v2 = test(); // --- (1)'

ここで、prettyPrint.jsでv2をダンプすると、以下の結果がもどる。



このことから、次の認識は重要である。

  1. 「関数名」での代入は、その関数への参照の代入を意味する。
  2. 「関数名()」での代入は、その関数の実行結果(正確には、「関数名」が参照する関数を実行させた結果)の代入を意味する。


さて、上のコードをよく見ると、(2)も代入式である。
(2)の右辺は、「無名関数」とか「匿名関数」とか言われているものである。この命名は、

  function function_name(){ .... }

という「名前のある関数」に由来しており、以下と等価である。

function test(){ 

    var _arr = ["pretty","print"];
    return _arr;

};

名前があろうとなかろうと、関数がメモリー空間にアロケートされることには変わりはないので、(2)も「無名関数の参照をtestに代入している」ことになる。


参考文献;
ZDNet: 白石俊平氏 ;JavaScriptのイロハ:「関数はオブジェクト」って理解できますか?
    … 関数の基本定義、関数名の意味と、それに()を付けて実行させることなどの記述があります。
ZDNet: 白石俊平氏 ;JavaScriptのイロハ:JavaScriptクロージャを完全理解!スコープチェインを知る(前編)のp2
    … 変数を格納するための機構としての「変数オブジェクト」などの記述があります。