952 :
デフォルトの名無しさん:2012/01/01(日) 01:33:58.33
出来たけど、面倒だね。
var Abc = function Abc(){
var x = 1;
return { func : function(){ return x + x; } }
}();
Abc.func();
>>952 10点(100点満点中)
惜しかったねw
答えはJavaScriptクックブックとか
そんな感じの名前のオライリー本に載ってるよ。
954 :
デフォルトの名無しさん:2012/01/01(日) 01:48:42.79
点数とかいらないから。知ってるなら書けよ。
だからオライリー本に書いておいたよ。
オ・レ・がw
956 :
デフォルトの名無しさん:2012/01/01(日) 02:24:13.37
おk。ありがとう。
めんどうくさいから
>>952でいいわ。
貴様オライリー本の著者を侮辱するのか!
絵に描いた餅より手の中にあるカンパンですよね
959 :
デフォルトの名無しさん:2012/01/01(日) 15:04:42.15
オライリーを侮辱するわけではなくて、
>>952が間違っているわけでもなく、目的も達成されているし、足りない部分があるとしても
さらに100点満点中90点分の何かがあるとは思えない(=
>>953の発言が信用出来ない)から
>>952でよしとした。
function ABC(){
if( this.constructor !== ABC ){ return new ABC(); }
var x = 1;
this.func = function(){ return x + x; };
}
var abc = ABC().func();
プライベートメンバの代わりにクロージャ使う場合は、
昔のコードならこうじゃね。
961 :
デフォルトの名無しさん:2012/01/01(日) 15:18:57.86
同じメンバなのに this.x で統一できないのは痛いよな。
言語として実装されてないわけだから、おとなしく _ を付けるしかないかな。
変に小細工して難解なコードになるのは本末転倒。
963 :
デフォルトの名無しさん:2012/01/01(日) 15:21:35.31
>>961 混乱させてすまん。
クックブックに出てきそうな普通のコードを書いただけで、
俺と
>>953とは無関係だよ。
利点はprototypeが使えること。
既にプロトタイプ式のクラスが廃れてきてる現代ではどうなの?ってコード。
965 :
デフォルトの名無しさん:2012/01/01(日) 15:47:25.02
>>964 ありがとう。
プロトタイプ式のクラスって廃れてきてるんだ。
その辺りの最新状況を学べる書籍や情報源ってある?
>>962 俺も同意見。プライベートは列挙不可属性だけで十分。
クロージャって使いまわすと複雑になるだけだから、
ちょっとしたlambdaな物に使うのが無難だと思う。
>>965 ごめんごめん。廃れてるってのは自分の勝手な意見で、
文献とかではなく、jQueryとかの印象で言ってる。
最近のソースって基本的に prototype をすげ替えるだけで、
クロージャ使ったプライベートメンバとか、
prototype.constructor書き換えとか複雑なことしないから。
968 :
デフォルトの名無しさん:2012/01/01(日) 16:05:55.51
>>968 列挙不可はdefinePropertyで設定できる。
970 :
デフォルトの名無しさん:2012/01/01(日) 16:59:44.44
>>969 ありがとう。
var Abc = {};
Object.defineProperty( Abc, "x", { value: 1, enumerable: false } );
Abc.func = function(){return this.x + this.x;}
Abc.func();
小細工、複雑、難解って点に関しては
>>952の方がマシな感じがする。
971 :
デフォルトの名無しさん:2012/01/01(日) 17:12:33.00
>>970だと Abc.x が undefined にならないんだね。
やっぱり、
>>952でいいわ。
>>970 ちょっと質問の意図を履き違えていたわ。
クラス内のプライベートメンバという意味じゃなくて、
クラス関係なくアクセス制御したいだけならクロージャでいいと思う。
973 :
デフォルトの名無しさん:2012/01/01(日) 17:17:23.23
974 :
デフォルトの名無しさん:2012/01/01(日) 22:00:18.25
var a = (function(){return 1;})();
var b = function(){return 1;}();
わざわざaの右辺のようにしているコードを見かけるんだけど、function(){return 1;} の周りに ( ) は必要?
bじゃダメなの?
こういう場合の優先順位をどう考えればいいのか知りたいんだけど、
演算子の優先順位はあるけど、ブロック{}を含めた優先順位ってどこかに書いてある?
>>974 bは最後まで読まないとクロージャだと分からないから控えたほうがいい。てか、やめろ!
976 :
デフォルトの名無しさん:2012/01/01(日) 22:41:33.66
なるほど。可読性を考えるとbにもメリットがあるということか。
>>974 aの方がbより1step少ないとかじゃないっけかなぁ
別にbで良いと思うよ
()をつける必然性がない。必要ないなら付けない方がいいという考え方もあり得る。
aを勧めるなら、cの方がもっといいだろ?
var c = (((((((((((function(){return 1;})))))))))))();
┐(´ー`)┌
>>978 すまん正直どっちでも良い
元々はbの方が中間コードで1step少ないと思ってたけど
実際は同じだったようだ
function()の前に(があるからクロージャーだと判断するとか、言語仕様に対して図々しい話だよな。
aなんて単なる無駄だから、bの方がいい。
aは無名関数が実行されて戻り値がaに代入される
bは関数オブジェクトがbに代入される。呼ばれるまで関数は実行されていない。
えっ
>>982 可読性を犠牲にしてたった二文字を削るのか。書く一方で保守の経験はないんだろうな。
何らかの意味を持つわけでもない文法上必然性のない(をfunction()の前に付けるとなぜ可読性が上がると考えているのか全く理解に苦しむ。
保守する人間に俺ルールの(の意味を読み取らせようとする図々しさに呆れ果てる。
削るのではなく元々無い二文字だ。
>>988 適当なライブラリ読んでみろ。jqueryでもprototype.jsでもclosurelibraryでもなんでもいい。
var hoge = function(){
// 処理が複数行におよぶ
})();//ここまでスクロールしないとクロージャだと分からない
これがなんで理解出来ないんだろ。たった二文字でここまで可読性上がるんだよ?
>>988 function構文はかっこ無しだと評価されないからエラーになる。
Objectも同じ。
むしろ一行で書く方が特例なんだよ。
>>989 バカはほっとけ。トリッキーな保守もできないコードしか生み出さないんだから。
function()の前に(が付いていると、閉じ括弧の後ろに();がついてるとか思っちゃう人間の方がよほどトリッキーな脳だろ。
だからFunction Objectは評価の問題もあって括弧付けるのが普通なんだってば。
JavaScriptのソースを普段読んでる人間なら、勝手に身に付いてる事の一つだろ。
これはひどい。理論抜きで意地だけで反発してる。
まあ、今まで疑問に思わずに勝手に身についたことを否定されたら意地にもなっちゃうわな。
規格に見つけられないなら、記憶違いだろうね。
var i = 0;
(function (){
console.log(i++);
})();
function (){
console.log(i++);
}();
test.js:5
function (){
^
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick
^
SyntaxError: Unexpected token (
var foo = function () {
// ...
};
var bar = (function () {
// ..
})();
は割と一般的な書きかたで逆のパターンはみないし、
括弧つけるほうがわかりやすいだろう。
2文字増えるだけだし。
関数の中の行数が増えると、読むときにちょっと面倒かと思う。
まあ、関数本体が十分に短かければ、大差ないかもね。
1000
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。