5

Stefanov の JS Design Patterns book で、彼は「1 つの var ステートメントを使用し、カンマで区切られた複数の変数を宣言する」と書いており、次のように「単一の var」パターンの例を示しています。

function func() {
    var a = 1,
        b = 2,
        sum = a + b,
        myobject = {},
        i,
        j;

ステファノフはさらに次のように書いています。

  • 「宣言時に変数を初期値で初期化することもお勧めします。」
  • 「前のコードの sum = a + b の場合のように、宣言時に実際の作業を行うこともできます。」

これで、次のようなコードができました。単一の var パターンで同じ数の変数を宣言しますが、「宣言時の実際の作業」はかなり多くなります。

var html = '{purchaseQty}<br>FR:&nbsp; {fromLoc}'
    ,tpl = new Ext.XTemplate(html)
    ,srcReqLoc = record.get('SRC_REQUEST_LOC').trim()
    ,srcSupLoc = record.get('SRC_SUP_LOC').trim()
    ,fromLoc = srcReqLoc ? srcReqLoc : srcSupLoc
    ,tplCfg = {
        purchaseQty: purchaseQty
        ,fromLoc: fromLoc
    };

「申告時の実作業」をやりすぎるデメリットとは?ところで、これはJavascriptの単一変数パターンの正確な複製とは考えていません。私はそれを過負荷にしていますか?私のコードだけで何が問題なのかではなく、一般的な欠点について尋ねているからです。

一般的な欠点は、エラーをチェックできないことであることがわかると思います。たとえば、私の例では、record.get から返されると予想される文字列に対して trim() を呼び出しますが、代わりに undefined が返された場合、「メソッドを呼び出すことはできません。 on undefined object" (またはそれが何であれ;) がスローされます。他に思いつく人いる?

4

3 に答える 3

6

私は個人的にDouglasCrockfordの側にいます(これに関係のない人には感謝していますが)、JavaScriptにはブロックスコープがないため、関数の先頭でvarsを宣言するのが最も理にかなっています。

JSLintサイトから:

ブロックスコープを持つ言語では、通常、最初に使用するサイトで変数を宣言することをお勧めします。ただし、JavaScriptにはブロックスコープがないため、関数のすべての変数を関数の先頭で宣言する方が賢明です。関数ごとに1つのvarステートメントを使用することをお勧めします。

唯一の欠点は、CまたはCベースのバックグラウンドから来た人がコードを読みにくくなることです。

ここではCrockfordのファンのように聞こえるかもしれませんが、コーディングスタイルと、なぜ脳がコード構造(言語によって異なります)で心臓を支配する必要があるのか​​について、この話をお勧めします。

于 2011-12-20T21:01:29.107 に答える
5

すべての変数をスコープの先頭、つまり関数の先頭またはグローバル コードの先頭で宣言することは理にかなっています。私はそれに同意します。

宣言時に初期値を提供する限り、それはガイドラインのようなものです。一般に、これ良い計画であり、単純な値に対しては確かに機能しますが、より複雑な計算を行うまで初期値がわからない場合があります。いくつかの値。そして時々それはあまりにも面倒です。

また、宣言時にループ インデックス変数に初期値を与えません。私にとっては、ループの開始時に値を割り当てる方がはるかに明確です。

すでに指摘したように、例外などを処理する必要がある場合は、関数の後半でもそれを行う必要があります。

いくつかの常識を使用してください。多くの変数がある場合、varステートメントが少し読みにくくなる可能性があるため、初期化の一部を関数の後半に移動できます。

私にとってはあなたのサンプルコードは問題ありませんが、さらに多くのコードを追加する必要がある場合は、コードが密集したブロックにあるため、変数名を簡単に選択できないため、読みにくくなりますが、-そして-そしてこれは明らかに好みの問題です。空白を追加できます。

var html       = '{purchaseQty}<br>FR:&nbsp; {fromLoc}'
    ,tpl       = new Ext.XTemplate(html)

    ,srcReqLoc = record.get('SRC_REQUEST_LOC').trim()
    ,srcSupLoc = record.get('SRC_SUP_LOC').trim()    
    ,fromLoc   = srcReqLoc ? srcReqLoc : srcSupLoc

    ,tplCfg    = {
        purchaseQty: purchaseQty
        ,fromLoc: fromLoc
    };

(=記号を並べるか、関連する変数を空白行でグループ化するか、またはその両方を行います。)

于 2011-12-20T21:47:01.140 に答える