Javascriptの基本:代入式
自分の足元を見直すつもりで、Javascriptに関して、いくつかの実験をしてみようと思う。まずは、代入式について考えてみたい。
まず、代入式は、
メモリー空間にアロケートされた右辺の参照アドレスを、左辺でラベル付けする … (a)
と定義するのが一般的と思う。このとき、そのラベルを「変数」と呼ぶ。
この「変数」をプログラム内で参照した場合、それが
- 右辺の結果
- 右辺の参照(アドレス:以後、「参照」と略す)
のいずれかを表すかは言語体系で異なっている。基本的な演算上は両者は同じ結果をもたらすが、比較演算などでは異なった振る舞いをする。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をダンプすると、以下の結果がもどる。
このことから、次の認識は重要である。
- 「関数名」での代入は、その関数への参照の代入を意味する。
- 「関数名()」での代入は、その関数の実行結果(正確には、「関数名」が参照する関数を実行させた結果)の代入を意味する。
さて、上のコードをよく見ると、(2)も代入式である。
(2)の右辺は、「無名関数」とか「匿名関数」とか言われているものである。この命名は、
function function_name(){ .... }
という「名前のある関数」に由来しており、以下と等価である。
function test(){ var _arr = ["pretty","print"]; return _arr; };
名前があろうとなかろうと、関数がメモリー空間にアロケートされることには変わりはないので、(2)も「無名関数の参照をtestに代入している」ことになる。
参考文献;
ZDNet: 白石俊平氏 ;JavaScriptのイロハ:「関数はオブジェクト」って理解できますか?
… 関数の基本定義、関数名の意味と、それに()を付けて実行させることなどの記述があります。
ZDNet: 白石俊平氏 ;JavaScriptのイロハ:JavaScriptクロージャを完全理解!スコープチェインを知る(前編)のp2
… 変数を格納するための機構としての「変数オブジェクト」などの記述があります。