ウェブ関係の仕事をはじめて少し経ちます。社内インフラでサイトを構築することがこれまでもあったりしましたので今やっていることにそれほど抵抗はないのですが、javascriptをよく理解できなくなっていて困っています。これまでは関数列挙して実装していたような覚えがあって、やりたいことを目的別に調べて実装して動いてわーい♪(別のブラウザでは動かなくてショボーン)の世界かと思ってたのですがどうもちがう。
どう違うのかはちょっとおいて置いて、ワタシがプログラム言語を学んだのは C → C++ → java → C# といった感じで、オブジェクト指向を学んだのも C++ からでした。javascriptがオブジェクト指向だということも以前から判ってはいるのですが、「なんか書けばまぁうごく」というやる夫並にひどい着地の仕方をしておりまして、「スコープ?あんの?varて書かなくてもうごくよ?」「this?いやいや。thisてか、クラスは?」とかそれはそれは酷いことになっています。ヒドイ。
で、以下になんぞこれ?と思った実装を記してみます。
■これはオブジェクトリテラルという表記法で、@ITやCore JavaScript 1.5 Guide:Literalsに説明がありました。ふーん。へー。オブジェクトなのね。便利ね。
■そろそろきっちりJavaScriptに無名関数のことがかいてありました。
■分解してみると、
1.この関数は無名関数である。
2.この無名関数は、オブジェクトリテラルを返しているようである。
までは、判りました。で、(function(){}())は無名関数を実行してるだけらしい。もちろん無名じゃなくともよいけど、無名関数だと自身をオブジェクトに渡すとかしないと呼びようがないので、定義しただけのものを実行したいのならこうするみたい。これは意外と腹に落ちた。
これらはここ数ヶ月でようやく知ったないようです。でもまだプロトタイプチェーンが腹に落ちてないので調べる。ちょっとjavascriptが自由すぎてびっくりしてる。
どう違うのかはちょっとおいて置いて、ワタシがプログラム言語を学んだのは C → C++ → java → C# といった感じで、オブジェクト指向を学んだのも C++ からでした。javascriptがオブジェクト指向だということも以前から判ってはいるのですが、「なんか書けばまぁうごく」というやる夫並にひどい着地の仕方をしておりまして、「スコープ?あんの?varて書かなくてもうごくよ?」「this?いやいや。thisてか、クラスは?」とかそれはそれは酷いことになっています。ヒドイ。
<ワタシ> __ .-´ ``ヽ / ⌒ `ヽ javascriptなんて素人向けのg / `ヽ ヽ (( / (●) ヽ |::⌒(__ (● ) | ヽ 人__) ⌒:::: | ヽ(__ン | 人 / | | / _ノ ノノ | __ .-´ ``ヽ / ヽー `ヽ えnあびゃぶ。 / ノ (O )ノ ̄ ̄`ヽ、―ニ / (●) __)⌒/ ´`ヽ _ 三,:三ー三,: | ::⌒(__ノ/ ノヽ--/ ̄ , ` ` ̄ ̄ ̄ 。ヽ 。 )( }. ...| /! ヽo (__ン }、ー‐し'ゝL _ 人 ー jr--‐‐'´} ;ーー------ / ヾ---‐'ーr‐'"== |それでもページに実装するスクリプトの規模がほんの数ステップなものですから、ちゃんと勉強する気にはなれなかったのですが、業務の上というかプライベートのほうで判らないことを調べていくにつれて、「え。。。なにやってんのこれ?」「何でこれで動くの?」といったことが多くなっていきます。
なぜ判らなくなってきたのか。
多分、数年前からjavascriptが再注目されて来ていた時にまったく見向きもしなかったため、昔のままの知識で取り残されたんだと思います。Ajaxなんてjavascirptで非同期にコンテンツをロードするだけでしょとか言いながらもその意味を全然わかってないのに見向きもしなかった。重ねてヒドイ。で、以下になんぞこれ?と思った実装を記してみます。
オブジェクトリテラル
var hoge = {};
いきなり何がしたいのかもわからん。ブロックを返してんのか。空のブロックを返して何がしたいんだ。■これはオブジェクトリテラルという表記法で、@ITやCore JavaScript 1.5 Guide:Literalsに説明がありました。ふーん。へー。オブジェクトなのね。便利ね。
匿名・無名関数
var moge = function(){};
var fuga = new moge();
1行目は関数ポインタみたいなことか?てか、メソッド名は?2行目を見たら実はコンストラクタ?ふざけてんのか(ふざけてません)■そろそろきっちりJavaScriptに無名関数のことがかいてありました。
無名関数を採用するメリットには、「命名する必要の無い関数をシンプルに記述できる」「(複数ファイルのJavaScriptライブラリを読み込んでいるときなどにおいて)、既存の関数/変数名との衝突を回避できる」という点が挙げられるふーん。なるほど。ということはmogeは無名関数の別名かな。で、javascriptにおいては全ての関数はコンストラクタになりうるらしいのでnewしてオブジェクトの生成ができると。そういうものか。
オブジェクトリテラルとワンタイム(使い捨て)メソッド
var piyo = (function( fst, snd ){
return {
prop:fst,
fuga:snd
};
}( 1, 2 ));
もう、いろいろナニコレ。(function(){}())てなに?■分解してみると、
1.この関数は無名関数である。
2.この無名関数は、オブジェクトリテラルを返しているようである。
までは、判りました。で、(function(){}())は無名関数を実行してるだけらしい。もちろん無名じゃなくともよいけど、無名関数だと自身をオブジェクトに渡すとかしないと呼びようがないので、定義しただけのものを実行したいのならこうするみたい。これは意外と腹に落ちた。
これらはここ数ヶ月でようやく知ったないようです。でもまだプロトタイプチェーンが腹に落ちてないので調べる。ちょっとjavascriptが自由すぎてびっくりしてる。



