[過去ログ] + JavaScript の質問用スレッド vol.117 + (1001レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
367: デフォルトの名無しさん [sage] 2014/12/08(月) 12:08:56.06 ID:3mx+HWhx(1/6) AAS
>>350
350(1): デフォルトの名無しさん [sage] 2014/12/05(金) 20:57:15.97 ID:+TXyzC2W(3/4) AAS
>>293
は明らかにおかしいだろ。

var x = 9;
var module = {
x: 81,
getX: function() { return this.x; }
};

module.getX() は明らかにmoduleの中の
81を返すように設計されたと考えるべきだ。

よっぽどひねくれた人じゃない限り、module.getXというのは
module以外の渡されたオブジェクトの
xを変えすためのメソッドなんですなんて物は作らない。

内部の処理は隠ぺいするべきものなのだから、内部の処理で必要な
オブジェクトは内部で管理するべきもの。

var x = 9;
var module = Module(); // new Module() で作成するという設計もあり
module.getX();

こういう使い方をするのが普通のやり方。
いちいちbindして呼び出すなんてありえない。
何も分かってなくて失笑w
bindは>>346
346(2): デフォルトの名無しさん [sage] 2014/12/05(金) 15:02:00.85 ID:LEC5N9e7(2/2) AAS
>>344
まぁ無理やり変数に代入しようとするからだな
element.addEventListener('mousedown', module.getX.bind(module), false);
とか
module内で
element.addEventListener('mousedown', this.getX.bind(this), false);
とか、毎回bindすれば分かりやすい
のようなコールバックに登録する時に必要で>>293
293(12): デフォルトの名無しさん [sage] 2014/12/02(火) 03:15:02.67 ID:MjRXeq65(1/3) AAS
外部リンク:developer.mozilla.org
初心者の JavaScript プログラマーがよくやる間違いは、
あるオブジェクトからメソッドを取り出し、後でその関数を呼び出すとき、
その内側の this 値が元のオブジェクトになると考えてしまうことです
(例えば、そのメソッドをコールバック関数に使うケース)。
特に配慮しなければ、元のオブジェクトは失われてしまいます
【訳注: 取り出した関数内の this としては使えなくなる】。
その関数に元々のオブジェクトを bind() して束縛された関数を生成すれば、
この問題をきちんと解決することができます:

var x = 9;
var module = {
x: 81,
getX: function() { return this.x; }
};

module.getX(); // 81

var getX = module.getX;
getX(); // 9, この場合 "this" はグローバルオブジェクトを参照するため

// 'this' を module に結びつけた新しい関数を生成
var boundGetX = getX.bind(module);
boundGetX(); // 81
はその事を言っている
369: デフォルトの名無しさん [sage] 2014/12/08(月) 13:32:15.31 ID:3mx+HWhx(2/6) AAS
>>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);

は無駄じゃないでしょうか?
なぜこう書くのでしょう?
JavaScriptはブロックスコープが無くてグローバルか関数スコープしかないから
グローバルに変数を撒き散らしたくない場合は、関数を作るしかない
その例では確かに無駄だがイディオムとして確立してるので常にそうすべき
372
(1): デフォルトの名無しさん [sage] 2014/12/08(月) 13:58:23.29 ID:3mx+HWhx(3/6) AAS
>>370
370(1): デフォルトの名無しさん [sage] 2014/12/08(月) 13:47:05.60 ID:e/VeyYdn(1/3) AAS
>>368
無名関数の引数にグローバルオブジェクトをbindするテクニックにとらわれているだけで無駄なコードだと思う
無名関数でスコープ制限するだけなら内部関数でも行われているしね
それはそうと、quiitaにはコメント機能があるから、コメントで質問してみると作者の意図が聞けていいんじゃないかな
だから無駄じゃない

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

とすればモジュールを簡単に定義できて、再利用する際の利便性が増す
> その例では確かに無駄だがイディオムとして確立してるので常にそうすべき
だから↑と言っている
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);

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

>>377
global なのにクラスとはこれいかに
>>368は全てのECMAScript実装でグローバル変数を定義する手法なんだが
この場合は>>374>>368のいうように下記コードで十分事足りる

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

実際には上記コードで事足りるケースが多いんだよな
IE8の名前付き関数のバグも関数スコープで制限するから名前に気を付ければ使える
>>374はグローバル変数を複数定義する場合に有効だが、グローバル変数を多数定義することは推奨されない
TypeScriptは>>368と全く同じコードを出力するし、当然何の不満も出てない

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

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

>>382のコードは継承を実装する時に変更する必要がある
386
(1): デフォルトの名無しさん [sage] 2014/12/08(月) 21:04:15.65 ID:3mx+HWhx(6/6) AAS
>>385
385(2): デフォルトの名無しさん [sage] 2014/12/08(月) 21:00:18.60 ID:A2V/rnic(1/2) AAS
>>384
> クラスじゃなくてモジュールだが、そんな変数名の些細な事はどうでもいい
おまえが>>377で「ベースクラス」といったんだが、おまえは自分の言葉に責任を持つ事すら出来ないのか

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

>>368の質問に対する答えとしては「ESとしては無駄。altJSを使用しているなら諦めるかフィードバックする。」になるだろう
> おまえが>>377で「ベースクラス」といったんだが、おまえは自分の言葉に責任を持つ事すら出来ないのか
(function(global){
 var SitesUtil = (function() {

 var SitesUtil = (function(super) { ← ベースクラスはこっちの事だよ
...
 })(BaseClass);
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.046s