javascriptのプログラムを組む時に単純にfunctionで関数を書いていると、「無名関数」を使わないといけないことに気がつく。
これは、JavascriptがHTMLソースの基本的なスクリプトライブラリとして汎用性をもたせようとすると、他のプログラムとコンフリクトしないようにするために、できるだけ変数や関数名がバッディングしないようにする必要があるため、いっそのこと空間名称を使わない無名関数が望ましいという事ですね。
無名関数について
function f1(a,b){
return a+b;
}
f1(1,2);
>> 3
(function(a,b){
return a+b;
})(1,2);
>> 3
少しややこしいように見えますが、空間名称を使わないので、コンフリクトが発生しません。
でも、このままだとせっかく関数なのに、再利用することができないので、プログラムとしては、ダメですね。
コンフリクトしにくい空間名称
全ての関数を一箇所にまとめてしまうことで、他の空間名称や関数、変数とぶつからないようにします。
var nameSpace = {
f1:function(a,b){return a+b},
f2:function(a,b){return a*b}
};
nameSpace.f1(1,2);
>> 3
nameSpace.f2(3,4)
>> 12
ちなみに、javascriptはリテラルに使用できる文字列が比較的多く、数値からスタートできないが、記号から開始してもいいという他の言語にはないルールがあり、空間名を「$nameSpace」などとすると、よりぶつかることは少なくなると思います。
余談ですが、僕の知り合いでは「$$$nameSpace」などという風に、記号を沢山いれてしまえ作戦で対応しているエンジニアもいましたwww
prototype調査
JSON形式の階層構造でライブラリのように構築してもいいんですが、この方式では、空間名称はただの添字扱いになってしまうのですが、この空間名称自体も関数化することもできます。
そのためにprototypeとclass化を覚えましょう。
var nameSpace = function(a){
this.name = a;
};
nameSpace.prototype.getName = function(){
return this.name;
};
var f1 = new nameSpace("name-space");
f1.getName();
>> name-space
var f2 = new nameSpace("name-space-2");
f2.getName();
>> name-space-2
オブジェクト構造に慣れていない人には構造が難しく思えるかもしれませんが、慣れるととても楽になります。
JSONライブラリと効率よく組み合わせることで、かなり便利なライブラリ構築ができるようになるので、オススメです。
0 件のコメント:
コメントを投稿