ECMAScript デス 3

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2012/01/01(日) 01:33:58.33
出来たけど、面倒だね。

var Abc = function Abc(){
var x = 1;
return { func : function(){ return x + x; } }
}();

Abc.func();
953デフォルトの名無しさん:2012/01/01(日) 01:47:54.43
>>952
10点(100点満点中)

惜しかったねw
答えはJavaScriptクックブックとか
そんな感じの名前のオライリー本に載ってるよ。
954デフォルトの名無しさん:2012/01/01(日) 01:48:42.79
点数とかいらないから。知ってるなら書けよ。
955デフォルトの名無しさん:2012/01/01(日) 01:51:48.03
だからオライリー本に書いておいたよ。

オ・レ・がw
956デフォルトの名無しさん:2012/01/01(日) 02:24:13.37
おk。ありがとう。

めんどうくさいから>>952でいいわ。
957デフォルトの名無しさん:2012/01/01(日) 10:10:22.87
貴様オライリー本の著者を侮辱するのか!
958デフォルトの名無しさん:2012/01/01(日) 11:44:46.38
絵に描いた餅より手の中にあるカンパンですよね
959デフォルトの名無しさん:2012/01/01(日) 15:04:42.15
オライリーを侮辱するわけではなくて、
>>952が間違っているわけでもなく、目的も達成されているし、足りない部分があるとしても
さらに100点満点中90点分の何かがあるとは思えない(=>>953の発言が信用出来ない)から
>>952でよしとした。
960デフォルトの名無しさん:2012/01/01(日) 15:11:01.23
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
>>960
その記述だと、>>952に対してどういうメリットがあるの?
962デフォルトの名無しさん:2012/01/01(日) 15:19:45.75
同じメンバなのに this.x で統一できないのは痛いよな。
言語として実装されてないわけだから、おとなしく _ を付けるしかないかな。
変に小細工して難解なコードになるのは本末転倒。
963デフォルトの名無しさん:2012/01/01(日) 15:21:35.31
>>962が何に対するレスなのか知りたい。
964デフォルトの名無しさん:2012/01/01(日) 15:42:19.33
>>961
混乱させてすまん。
クックブックに出てきそうな普通のコードを書いただけで、
俺と>>953とは無関係だよ。

利点はprototypeが使えること。
既にプロトタイプ式のクラスが廃れてきてる現代ではどうなの?ってコード。
965デフォルトの名無しさん:2012/01/01(日) 15:47:25.02
>>964
ありがとう。

プロトタイプ式のクラスって廃れてきてるんだ。
その辺りの最新状況を学べる書籍や情報源ってある?
966デフォルトの名無しさん:2012/01/01(日) 15:51:56.73
>>962
俺も同意見。プライベートは列挙不可属性だけで十分。
クロージャって使いまわすと複雑になるだけだから、
ちょっとしたlambdaな物に使うのが無難だと思う。
967デフォルトの名無しさん:2012/01/01(日) 16:00:37.78
>>965
ごめんごめん。廃れてるってのは自分の勝手な意見で、
文献とかではなく、jQueryとかの印象で言ってる。

最近のソースって基本的に prototype をすげ替えるだけで、
クロージャ使ったプライベートメンバとか、
prototype.constructor書き換えとか複雑なことしないから。
968デフォルトの名無しさん:2012/01/01(日) 16:05:55.51
>>966
列挙不可属性ってどうやってつけるの?

>>967
ありがとう。よくわかった。
969デフォルトの名無しさん:2012/01/01(日) 16:11:19.05
>>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でいいわ。
972デフォルトの名無しさん:2012/01/01(日) 17:15:29.10
>>970
ちょっと質問の意図を履き違えていたわ。
クラス内のプライベートメンバという意味じゃなくて、
クラス関係なくアクセス制御したいだけならクロージャでいいと思う。
973デフォルトの名無しさん:2012/01/01(日) 17:17:23.23
>>972
了解。ありがとう。
974デフォルトの名無しさん:2012/01/01(日) 22:00:18.25
var a = (function(){return 1;})();
var b = function(){return 1;}();

わざわざaの右辺のようにしているコードを見かけるんだけど、function(){return 1;} の周りに ( ) は必要?
bじゃダメなの?

こういう場合の優先順位をどう考えればいいのか知りたいんだけど、
演算子の優先順位はあるけど、ブロック{}を含めた優先順位ってどこかに書いてある?
975デフォルトの名無しさん:2012/01/01(日) 22:39:37.20
>>974
bは最後まで読まないとクロージャだと分からないから控えたほうがいい。てか、やめろ!
976デフォルトの名無しさん:2012/01/01(日) 22:41:33.66
なるほど。可読性を考えるとbにもメリットがあるということか。
977デフォルトの名無しさん:2012/01/01(日) 22:44:56.26
>>974
aの方がbより1step少ないとかじゃないっけかなぁ
別にbで良いと思うよ
978デフォルトの名無しさん:2012/01/01(日) 22:53:26.78
>>977
bを勧める理由はなに?
979デフォルトの名無しさん:2012/01/02(月) 00:19:53.14
()をつける必然性がない。必要ないなら付けない方がいいという考え方もあり得る。

aを勧めるなら、cの方がもっといいだろ?
var c = (((((((((((function(){return 1;})))))))))))();
980デフォルトの名無しさん:2012/01/02(月) 00:26:33.69
┐(´ー`)┌
981デフォルトの名無しさん:2012/01/02(月) 00:36:59.88
>>978
すまん正直どっちでも良い
元々はbの方が中間コードで1step少ないと思ってたけど
実際は同じだったようだ

982デフォルトの名無しさん:2012/01/02(月) 00:43:20.95
function()の前に(があるからクロージャーだと判断するとか、言語仕様に対して図々しい話だよな。

aなんて単なる無駄だから、bの方がいい。
983デフォルトの名無しさん:2012/01/02(月) 00:59:58.43
>>981
この話(↓)と勘違いした、とか?

JavaScriptの無名関数の実行 (function(){})() と (function(){}()) の違い | 圧縮電子精神音楽浮遊構造体
ttp://polygon-planet.blogspot.com/2011/12/javascript-function-function.html
984デフォルトの名無しさん:2012/01/02(月) 01:05:03.60
>>983
そうそう
985デフォルトの名無しさん:2012/01/02(月) 01:57:28.86
aは無名関数が実行されて戻り値がaに代入される
bは関数オブジェクトがbに代入される。呼ばれるまで関数は実行されていない。
986デフォルトの名無しさん:2012/01/02(月) 02:01:41.47
えっ
987デフォルトの名無しさん:2012/01/02(月) 02:11:17.69
>>982
可読性を犠牲にしてたった二文字を削るのか。書く一方で保守の経験はないんだろうな。
988デフォルトの名無しさん:2012/01/02(月) 02:20:33.55
何らかの意味を持つわけでもない文法上必然性のない(をfunction()の前に付けるとなぜ可読性が上がると考えているのか全く理解に苦しむ。
保守する人間に俺ルールの(の意味を読み取らせようとする図々しさに呆れ果てる。

削るのではなく元々無い二文字だ。
989デフォルトの名無しさん:2012/01/02(月) 02:33:31.01
>>988
適当なライブラリ読んでみろ。jqueryでもprototype.jsでもclosurelibraryでもなんでもいい。
var hoge = function(){
// 処理が複数行におよぶ
})();//ここまでスクロールしないとクロージャだと分からない
これがなんで理解出来ないんだろ。たった二文字でここまで可読性上がるんだよ?
990デフォルトの名無しさん:2012/01/02(月) 02:34:55.27
>>988
function構文はかっこ無しだと評価されないからエラーになる。
Objectも同じ。
むしろ一行で書く方が特例なんだよ。
991デフォルトの名無しさん:2012/01/02(月) 02:36:13.67
>>989
バカはほっとけ。トリッキーな保守もできないコードしか生み出さないんだから。
992デフォルトの名無しさん:2012/01/02(月) 02:38:18.21
function()の前に(が付いていると、閉じ括弧の後ろに();がついてるとか思っちゃう人間の方がよほどトリッキーな脳だろ。
993デフォルトの名無しさん:2012/01/02(月) 02:40:35.22
だからFunction Objectは評価の問題もあって括弧付けるのが普通なんだってば。
JavaScriptのソースを普段読んでる人間なら、勝手に身に付いてる事の一つだろ。
994デフォルトの名無しさん:2012/01/02(月) 02:47:43.90
これはひどい。理論抜きで意地だけで反発してる。
995デフォルトの名無しさん:2012/01/02(月) 02:49:37.50
まあ、今まで疑問に思わずに勝手に身についたことを否定されたら意地にもなっちゃうわな。
996think49 ◆bKk/qcAKuM :2012/01/02(月) 02:54:11.97
私は

function a () {}(); // ES3違反 (ES5準拠)
(function b () { ; })(); // ES3準拠

と教わった記憶がありますが、どの規則を指しているのか見つけられなかったり。
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/12_Statements.html#section-12.4
http://es5.github.com/#x12.4
と当たりを付けたら違いました…。
997デフォルトの名無しさん:2012/01/02(月) 02:58:19.29
規格に見つけられないなら、記憶違いだろうね。
998デフォルトの名無しさん:2012/01/02(月) 03:04:23.17
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 (

999デフォルトの名無しさん:2012/01/02(月) 03:05:36.09
var foo = function () {
// ...
};
var bar = (function () {
// ..
})();
は割と一般的な書きかたで逆のパターンはみないし、
括弧つけるほうがわかりやすいだろう。
2文字増えるだけだし。
関数の中の行数が増えると、読むときにちょっと面倒かと思う。

まあ、関数本体が十分に短かければ、大差ないかもね。
1000デフォルトの名無しさん:2012/01/02(月) 03:06:31.41
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。