[過去ログ] + JavaScript の質問用スレッド vol.117 + (1001レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
377
(4): デフォルトの名無しさん [sage] 2014/12/08(月) 15:28:29.56 ID:3mx+HWhx(4/6) AAS
>>374
374(4): デフォルトの名無しさん [sage] 2014/12/08(月) 14:11:28.85 ID:e/VeyYdn(3/3) AAS
>>368のglobal束縛を生かすならこう書く

(function(global){
 function SitesUtil(site){
  this.site = site;
 }
 SitesUtil.prototype.getTemplateByName = function(templateName) {
(略)
  };
 global.SitesUtil = SitesUtil;
})(this);

>>368は無駄にクロージャを生産しすぎなんだよ
(function(global){
 var SitesUtil = (function() { ← これは

 var SitesUtil = (function(super) {
...
 })(BaseClass);

とベースクラスを渡す為のもんなんだよ
> その例では確かに無駄だがイディオムとして確立してるので常にそうすべき
先人の知恵が詰まったイディオムと言ってんだからまずは理解しようとしろ
382
(1): デフォルトの名無しさん [sage] 2014/12/08(月) 19:43:37.49 ID:dHRqrq3F(1) AAS
>>376
376(1): デフォルトの名無しさん [sage] 2014/12/08(月) 14:38:33.34 ID:KCPal8fz(2/4) AAS
>>374
ちなみにcoffeescriptだと>>374のケースでも>>368なコード出力するよね
確かにaltJS起因の可能性はあるな
そんなコードを出力するなよ、とは思うが

>>377
global なのにクラスとはこれいかに
>>368
368(9): デフォルトの名無しさん [sage] 2014/12/08(月) 13:25:02.71 ID:uRv2wrgF(1) AAS
質問です
外部リンク:qiita.com
ここのサイトの「インスタンス作る版の例」みたいに

(function(global){
 var SitesUtil = (function() {
  function SitesUtil(site){
   this.site = site;
  }
  SitesUtil.prototype.getTemplateByName = function(templateName) {
(略)
  };
  return SitesUtil;
 })();
 global.SitesUtil = SitesUtil;
})(this);

と書いてる例を (CoffeeScript が吐いた js とかでも) 良く見かけますが
最初と最後の

(function(global){

 global.SitesUtil = SitesUtil;
})(this);

は無駄じゃないでしょうか?
なぜこう書くのでしょう?
は全てのECMAScript実装でグローバル変数を定義する手法なんだが
この場合は>>374>>368のいうように下記コードで十分事足りる

var SitesUtil = (function() {
 function SitesUtil(site){
  this.site = site;
 }
 SitesUtil.prototype.getTemplateByName = function (templateName) { };
 return SitesUtil;
})();

実際には上記コードで事足りるケースが多いんだよな
IE8の名前付き関数のバグも関数スコープで制限するから名前に気を付ければ使える
>>374はグローバル変数を複数定義する場合に有効だが、グローバル変数を多数定義することは推奨されない
385
(2): デフォルトの名無しさん [sage] 2014/12/08(月) 21:00:18.60 ID:A2V/rnic(1/2) AAS
>>384
384(1): デフォルトの名無しさん [sage] 2014/12/08(月) 20:05:03.17 ID:3mx+HWhx(5/6) AAS
>>382
TypeScriptは>>368と全く同じコードを出力するし、当然何の不満も出てない

> global なのにクラスとはこれいかに
クラスじゃなくてモジュールだが、そんな変数名の些細な事はどうでもいい

> 実際には上記コードで事足りるケースが多いんだよな
特定のケース毎にコードを変えて書くならそれでいいだろうよ
ただし出来る限り常に同じ書き方をすべきだ

>>382のコードは継承を実装する時に変更する必要がある
> クラスじゃなくてモジュールだが、そんな変数名の些細な事はどうでもいい
おまえが>>377で「ベースクラス」といったんだが、おまえは自分の言葉に責任を持つ事すら出来ないのか

>>368の global は「グローバルオブジェクト」であってベースクラスだかモジュールだか知らんものではない
Strict Mode では this の参照先が変化するが、グローバルコードだけは this でグローバルオブジェクトを参照できる
その仕様を利用して関数スコープ内でグローバルオブジェクトを参照する方法が考案されたが、>>374はその一つだ
「なぜ this でグローバルオブジェクトを参照するのか」「なぜ引数で渡しているのか」を良く考えるべきだ

>>368の質問に対する答えとしては「ESとしては無駄。altJSを使用しているなら諦めるかフィードバックする。」になるだろう
386
(1): デフォルトの名無しさん [sage] 2014/12/08(月) 21:04:15.65 ID:3mx+HWhx(6/6) AAS
>>385
> おまえが>>377で「ベースクラス」といったんだが、おまえは自分の言葉に責任を持つ事すら出来ないのか
(function(global){
 var SitesUtil = (function() {

 var SitesUtil = (function(super) { ← ベースクラスはこっちの事だよ
...
 })(BaseClass);
409
(1): デフォルトの名無しさん [sage] 2014/12/09(火) 17:26:59.75 ID:ZQ0w8L2n(8/9) AAS
>>408
408(1): デフォルトの名無しさん [sage] 2014/12/09(火) 17:11:44.09 ID:L9Kvawn8(4/6) AAS
>>406
俺の書きたいことが>>373に書かれてたので繰り返さないが、>>373は理解できてるか?

> 変数名は別に何でもいいんだが、そんな些細なことに何でこだわるんだか…
なんでもいいならglobalなんてまぎらわしい単語使うなってこった。
>>373
373(2): デフォルトの名無しさん [sage] 2014/12/08(月) 14:06:47.92 ID:e/VeyYdn(2/3) AAS
>>372
>>368の中のコードで同じようなことをやってるから無駄

> (function(global){
なぜ Module が global なのさ
一つのやり方に拘ってるから全体が見えないんでしょ

var Module = (function(Module){
...
return Module;
})(Module || {} );

> >>368の中のコードで同じようなことをやってるから無駄
>>377のベースクラスを渡す為のもんなんで無意味ではない
(実際のコードはベースクラスを渡してないから無駄と言えば無駄にはなってるが)

> なんでもいいならglobalなんてまぎらわしい単語使うなってこった。
つうかある程度経験があるやつならそんな事に突っ込まないよ…
だって普通に使われてるイディオムなんだから
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.039s