2009-05-22 8 views
2

私はWITHに問題があることを覚えているようです。私はそれを見逃すことはありません。私は自分のコードの各行を自分の上に置くことを好む。JavaScriptのWITHステートメントで何が問題になっていますか?

私は(SOで)人々がjQueryの好きな機能の1つを連鎖させることを学んだときに、これについて不思議に思っていました。 JavaScriptのWITHとjQueryの連鎖は基本的に同じ機能です

+1

簡単な手順になります:WITHステートメントを使用してと間違って何1.を、そしてチェイニングなどのWITH文は2か? 2つの質問を分けることを検討する必要があります。 – dthrasher

答えて

6

と連鎖は全く同じではありません。スコープには影響しますが、連鎖は有効ではありません。考えてみましょう:

a.b.c = foo; 

か:第2のケースで

with(a.b) { c = foo; } 

を、cはブロックして外に存在している場合、あなたは考えを持っていないてきたので、それが可能だ場合、あなただけの別の部分に何かをつかうしていることプログラムの頼りになっています。

8

いいえ、彼らは同じものではありません...で

は完全に自分の名前を修飾することなく、クラスのメンバを参照するために簡略化したものです。

with o 
{ 
    x = y; // where x is a member of o. But how can you tell for sure? 
} 

ダグラス・クロフォードが何について言いたいのかを読んでください。彼はそれを避けることを奨励する - エラーが発生しやすく、あいまいであるという。私は彼に同意する。

jQueryチェーンは、あるメソッドを別のメソッドに直接パイプすることができる流暢なインターフェイスを実装する方法です。つまり、与えられたメソッドの出力は、次のメソッドへの入力として機能します。多くの空白を使用すると、jQueryの連鎖は実際のように見えます。下の例は、John Resigがこれを示しています。

jQuery("div").hide("slow", function(){ 
    jQuery(this) 
    .addClass("done") 
    .find("span") 
     .addClass("done") 
    .end() 
    .show("slow", function(){ 
     jQuery(this).removeClass("done"); 
    }); 
}); 

Read about jQuery chaining herehere

2

あなたはwithを避けるべき理由として良い説明のためwith Statement Considered Harmfulをお読みください。

いいえ、withが連鎖すると同じではありません。

のJavaScriptのwith文は、繰り返し書き込むため省略表現を提供することを目的としたオブジェクトにアクセスします。

0

また、Mozilla hereから参照することもできます。

には、以下のことが人間の読者またはJavaScriptコンパイラのためのハード非修飾名は、スコープチェーンに沿って発見されるかどうかを決定することができます「で」記事

の断片であり、そうであれば、どのオブジェクトで。したがって、この例を与え:

function f(x, o) { 
    with (o) 
     print(x); 
    } 

fが呼び出されたときにのみX見出さいずれかまたはしない、および見つかった場合は、Oまたは(そのようなプロパティが存在しない場合)第一の正式なX名Fの起動オブジェクトにのいずれかであります引数。 2番目の引数として渡すオブジェクトにxを定義するのを忘れた場合や、類似のバグや混乱があった場合は、予期しない結果しか得られません。

4

fwiw、私はクロークフォードと全体の動きに強く反対します。はい、私は亡くなった騎乗位を楽しませています。

私は抗年代に同意する点は、実際には直接使用することはありません意味オブジェクトの作成/割り当てのための松葉杖として使用すべきではないと:

BAD

with(a.b) 
{ 
    c = x; 
} 

GOOD

with(a) 
{ 
    b.c = x; 
} 

私は、両方ともブロックを示し(空白を取り除いて空白を取り除くので) )冗長な宣言/割り当てに頼ることなく。私の主張は、あなたが何をしているのかわからないときにのみ危険であり、あなたがしていることが分からなければそれをやってはならないということです。私が言ったように、私はここに穀物に反対していることを実感します。

+0

「私の主張は、あなたが何をやっているのかわからないときには危険です。」 しかし、それはCrockfordが作る点ではありません...あなたがやっていないと考えることを容易にします!私は、提供することで避けることの証言が好きです。私はまた、死んだ乗馬犯人のためのスイートスポットを持っています。 –

+1

私は、間違いを起こしやすいという考え方には同意していません.C++もそういうものと戦うのは難しいでしょう。 withの使い方が悪いと、問題を引き起こす原因となり、危険ではない方法で使用すると、より読みやすいコードが得られます。 (imho) – annakata

+0

オブジェクトから値を読み取るときなど、 'with'が意味を持つケースがあります。しかし、IIRC「with」を使用するとGoogle Cromeが遅くなると聞きましたが、新しい変数にオブジェクトを割り当てて代わりにその変数を使用することをお勧めします。キャッシングとは何か関係があったと思う。パスカルのような他の言語では、コンパイラがコードを最適化することができるので、 'with'は高速化できますが、javascriptではそうではありません。 – some

1

私は上記の質問に答えられていると思いますが、「with」のトピックに私の2セントを追加したいと思っています。ほとんどすべての例は、あいまいなクラス名と変数名です。との間には、維持して理解するのが難しいです。変数、クラス、オブジェクトの名前に何らかの意味がある場合は、を指定することができます。

var car = { 
      wheels: {radius: 5, rim: 'gold', shape: 'circle'}, 
      body: {color: 'black', windows: 'tinted'} 
      }; 

と今:

with (car){ 
    wheels.shape = square; 
    body.color = blue; 
} 

ポイント強力で、あなたの後に、プログラマのために多くの時間を節約することができて、います。それは正しく使用し、既に変数の冗長な命名と十分なコメント付けをしている場合にのみうまくいきます。さらに、誰かがあなたがしなければと言った:

with(a){ 
    x = 3; 
} 

何とかクラスのメンバーではない変数が何らかの形で上書きされますすること。グローバル変数xとブロック内のプロパティa.x、唯一a.x取得のそれは現在のスコープであるため、上書きがある場合、私は間違っているが、なら、私を修正してください。あなたが運転

a.b.c.d.e.foo = someValueのを以下のためのステートメントで使用することができます

+0

あなたの "x"の例に関する反論の引数は、whcer xがグローバルであるかどうかわからないということです。xメンバーがない場合、動作は期待通りではないかもしれません。 – annakata

+0

私はちょうど*と*の作品の知識を持つ誰もが把握できると思います。特に変数名が冗長である場合 –

+0

ええ、私はまったく異教徒ではありません:) – annakata

0

。 a.b.c.d.e.doo = somevar;

として

(a.b.c.d.e) {FOO = someValueの持ちます。 doo = somevar; }

いますが、JavaScriptの

するvar V = a.b.c.d.eでは良いオプションがあります。 v.foo = somevalue; v。doo = somevar;

これは、あなたがここに二つの異なる質問をしてきました:)

関連する問題