2010-11-22 9 views
12

ここで私はそれを使うのが妥当だと思います。 代替手段は何ですか?どのように私は一般的にそれらを使用することを避けることができますし、どうしてjsLintによれば、グローバルを利用するのが悪いのですか?なぜグローバルは悪いですか?

(function($){ 
    $(function(){ 
    $body = $('body'); //this is the BAD Global 

    $.each(somearray ,function(){ $body.dosomething() }); 

    if (something){ 
    $body.somethingelse(); 
    } 

    }); 
}(jQuery)); 

このことを理解してもらえますか?そして私にもっと良い解決策を与えてくれますか?

答えて

18

グローバルは悪いです。後で、あなたはそれらを全面的に使用した後で、非常に醜い問題を引き起こします。これは、コードを一から書くことなく、もう解決できません。

例:いくつかの機能を定義するのに$bodyを使用します。それはうまく動作します。しかし、最終的には価値が必要です。したがって、$body.fooを使用します。正常に動作します。次に、$body.barを追加します。そして数週間後に別の値が必要になりますので、$body.barを追加してください。

コードをテストするとうまくいくようです。しかし、実際には、同じ変数を2回「追加」しています。 JavaScriptは「新しい変数を一度作成する」という概念を理解していないため、問題ありません。すでに作成されていない限り、「作成」を知っているだけです。だからあなたのコードを使用し、最終的に、1つの関数は$body.bar別の関数を改変します。さえ、問題があなたに多くの時間がかかることを見つけるために。

だからこそ、変数は必要に応じてのみ見ることができます。このようにして、ある機能は別の機能を破ることができません。これはコードが大きくなるにつれてますます重要になります。

2

あなたはそれが

(function($){ 
    $(function(){ 
    var $body = $('body'); //this is the local variable 

    $.each(somearray ,function(){ $body.dosomething() }); 

    if (something){ 
    $body.somethingelse(); 
    } 

    }); 
}(jQuery)); 
+0

また、$ body – Mchl

+0

という名前のグローバル変数の一部を上書きしますが、この例ではグローバル変数を置き換えます。 – mpapis

+2

宣言されたローカル変数を使用する関数リテラル関数と同じスコープが定義されていて[closure](http://jibbering.com/faq/notes/closures/)と呼ばれ、jQueryで幅広く使用されるべきです。 – Phrogz

2

Globale変数は、他のスクリプトと衝突できたり上書きされ、誰によって上書きされる可能性があり、それはVARせずに、その関数のスコープ内にローカルになり、変数$本体とそれを定義する必要があります。グローバルを必要としないときは、避けることをお勧めします。 (あなたのJS-バージョン-のサポートが1.7よりも大きい場合、またはlet)単にvarを使用します。

(function() { 
    var foo = 'bar'; 
    alert(foo); 
})(); 
2

あなたは(varキーワードの使用は)それを作るだろうと

var $body = $('body'); 

としてそれを書き換えることができあなたの目的には十分であるローカル変数。あなたのeachコールバックの範囲内になります。

グローバルを使用することが悪い理由は、それが他のものによって上書きされる可能性があるからです。コードの拡張性を高めるには、使用する他のスクリプトに依存します。スクリプトを可能な限り自立的に保つことが望ましく、できるだけ依存性が少ないため、外部の世界を指しています。

0

jsLintは非常に厳しいです。おそらくあまりにもそれを懸念する必要はありません。

しかし、あなたが悪い感じた場合、あなたはちょうどあなたがjQueryスコープどのようにそれを行うことができます:彼らはすぐに問題を起こさないため

(function($){ 
    $(function(){ 
    $.each(somearray ,(function($body){ $body.dosomething() })($('body')); 

    if (something){ 
    $('body').somethingelse(); 
    } 

    }); 
}(jQuery)); 
+3

私は、一般的にjsLintが言うことのすべてをうまく処理する必要はないことに同意しますが、この文脈で言及しません。なぜなら、グローバルが苦痛なく回避できれば、変数をローカル変数として宣言することができます。他のアクションは必要ありません。 –

+0

@David Hedlund:合意 – kizzx2

関連する問題