やっぱりJSがわかりません。
わからないって!
今日はてブを眺めてて読めないコードを見つけた。マジでわからん。
>>function (cont) { return cont(1, 2); }(function(a, b) { return a + b; });
これ。=>3とでる。CPSらしい。わからんって。
ということで分解しようとしたけど。。だめだった。
http://journal.mycom.co.jp/column/js/002/index.html
をにたどり着けて納得(たぶん)。もう自信ないyo!
//実行環境は(WScript.exe) //alertなぞというご機嫌なものはないので function out(msg){ WScript.Echo(msg); } //として出力関数を定義 //cmd.exeでファイル名.jsとすればjsって拡張子につられてWScript.exeで実行されるはず。 //お題 //out(function (cont) { return cont(1, 2); }(function(a, b) { return a + b; }));//=>3 //がわかりません。 //ref:http://journal.mycom.co.jp/column/js/002/index.html //関数を変数にバインドする、というらしい。 var f = function(x){ return x + 1; }; out(f(1));//=>2 //かんけいないけどJSはブロックで閉じない。 var y=1; { var y = 4; } out(y);//=>4 //無名関数を定義、その場で代入する例。キモイ。だがこれがわからなかった。 var three_feet = function(x){ var y = 3.2; return x * y; }(3) out(three_feet);//=>9.6 //そろそろ分解できそう。 //まず、上の例は下とおなじ var funA = function(x){ var y = 3.2; return x * y; }; var th = funA(3); out(th);//=>9.6 //ということで。 //unction (cont) { return cont(1, 2); }(function(a, b) { return a + b; }); //は var hoge = function (cont) { return cont(1, 2); }(function(a, b) { return a + b; }); out(hoge); //と(まずは)同じ。さらに var hogeF = function(cont){ return cont(1,2); }; var hogeF_ = hogeF(function(a,b){ return a + b; }); out(hogeF_); //とできたり、 var hogeF2 = function(a,b){ return a + b; }; out(hogeF(hogeF2)); //こう書き下せるふむ。よしOK。
わからなかったのは無名関数(無名関数)ってキモイ形だったからなんですね。
偉い人に聞いたらarguments.calleeなソースを魅せられてガクブルになった訳ですが、無視します。
var a = 0; var F = function(){ a++; }; F(F(F(F((F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F( F(F(F(F((F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F( F(F(F(F((F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F( F(F(F(F((F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F( F(F(F(F((F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F( F(F(F(F((F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F( F(F(F(F((F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F( F(F(F(F((F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F( F(F(F(F((F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F( F(F(F(F((F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F( F(F(F(F((F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F( F(F(F(F((F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F( F(F(F(F((F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F( F(F(F(F((F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F(F( )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) )))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ; alert(a);
あああ
追記1
うちにかえってきました。悔しくて眠れないのでかんがえました。情けないなぁ。
//f(3)(2)(2)(12)(23)(3)こういうキモ過ぎる呼び出しがしたい //((処理して自関数を戻し->この括弧)(引数))(引数) //------処理,自関数を戻し------->この括弧↑ //----------------------関数(引数)------------->関数もどってきてるけど無視。 //って書いても意味わからんな。 ((function test(num){ alert(--num); return arguments.callee; })(3))(2);//=>2,1 //括弧を一個省略できたー。 (function (num){ alert(num); return arguments.callee; })(3)(2);//=>3,2 //無名関数化ーーー (function (num){ alert(num); return arguments.callee; })(3)(2);//=>3,2 //括弧をさらに一個省略というのははできないのかも。 /*だめーーー function (num){ alert(num); return arguments.callee; }(3)(2)){};//=>3,2 */ //関数をとる var f = function(num){ alert(++num); return arguments.callee; }; f(4)(3)(2)//=>5,4,3; //キモ過ぎる形になりました。
で、これが何の役にたつのかがわかりません。
追記2
//で何に使うかを考える //コンストラクタ的な? var Car = function({model,type}) { this.model = model; this.type = type; // alert(this.model); }; //プロトタイプ Car.prototype = { 'model':'noname', 'type':'notype', 'run':function(){ alert("実行"); } }; //チェック var hana = new Car({model:'FunCargo',type:'ccc'}); var F = function({model_,type_}){ Car({model:model_,type:type_}); return arguments.callee; }; /* var g = F({model_:'1st',type_:'tp1'}) ({model_:'2nd',type_:'tp2'}) ({model_:'3rd',type_:'tp3'}) ({model_:'4th',type_:'tp4'}) ; alert(typeof g); */ //で、何に使うのだろう? //こんなところでfunctionとかと確認したところで。 //オブジェクトに仕事させておしまい的な使い方?でもこれメモリ使用量的にやばい域がちょっとした。 var F2 = function({model_,type_}){ (new Car({model:model_,type:type_})).run(); return arguments.callee; }; F2({model_:'1st',type_:'tp1'}) ({model_:'2nd',type_:'tp2'}) ({model_:'3rd',type_:'tp3'}) ({model_:'4th',type_:'tp4'}) ; //実験使用そうしよう。いっぱい作ってみる var F3 = function({model_,type_}){ new Car({model:model_,type:type_}); return arguments.callee; }; F3({model_:'1st',type_:'tp1'}) ({model_:'2nd',type_:'tp2'}) ({model_:'3rd',type_:'tp3'}) ({model_:'4th',type_:'tp4'}) /*中略(めっちゃたくさん)*/ ({model_:'2nd',type_:'tp2'}) ({model_:'2nd',type_:'tp2'}) ({model_:'3rd',type_:'tp3'}) ; alert('終わった。このときメモリは?'); //=>ちょっとあがってしばらくしたらまた元にもどったから解放されたと信じたい。
オブジェクト作ってその場で処理してはいおしまい、的な使い方。だけどループ回した方が
いいよね。どう考えても。
教えてくれた偉い人はDRYぐらいしか使い道わからんと。
ふむ。パラメータが全然違う時にはループは無理(と仮定しよう)なので
タイプ数も減りますね。確かに。
追記3
だが結局関数がどうとかこうとかはしっくり来なかった。
//関数を引数にとれる、ということ。 function test(cont){ alert(typeof cont + "@test") ; alert(cont(1,2)); } //関数を格納した変数 var fu = function(a,b){ return a + b; }; alert(typeof fu);//=>function test(fu);
あぁ、どこかでやった感覚だ。。
これならよいですね。だけど1,2を外から与えることはできないのでしょうか。
できない感じがどこかでみたんだよなぁ。はぁ。情けない。「あれ」だよな。
ちょっとすっきりしたので寝る。