0

私は私の些細なウェブアプリのいくつかのバグを修正し、いくつかの興味深い行に出くわしました。なぜ私がそれらの行を以前のように実装したのか思い出せません。今、私はそれらを「通常の」構文に変更しました、そしてすべては大丈夫です。好奇心からの私の質問:なぜこの方法はまったく機能しなかったのですか?構文エラーが予想されますが、そうではありませんでした。コードは機能しました。

これは古いメソッドの実装です。

ListFillFilter: function(list){
    if (OC.Shorty.Debug) OC.Shorty.Debug.log("using 'default' method to filter filled list");
    // only makes sense for default OC.Shorty list
    var data=new Array();
    data['sum_shortys']=$('#desktop #list-of-shortys tbody tr').length;
    data['sum_clicks']=0;
    $('#desktop #list-of-shortys tbody tr').each(function(){
        data['sum_clicks']+=parseInt($(this).attr('data-clicks'),10);
    });
    OC.Shorty.WUI.Sums.fill.apply(OC.Shorty.Runtime.Context.ListOfShortys,[data]),
    // filter list
    OC.Shorty.WUI.List.filter.apply(this,[list,'target',list.find('thead tr#toolbar th#target #filter').val()]),
    OC.Shorty.WUI.List.filter.apply(this,[list,'title', list.find('thead tr#toolbar th#title #filter').val()]),
    OC.Shorty.WUI.List.filter.apply(this,[list,'status',list.find('thead tr#toolbar th#status select :selected').val()])
    // sort list
    $.when(
        OC.Shorty.Action.Preference.get('list-sort-code')
    ).done(function(pref){
        OC.Shorty.WUI.List.sort(list,pref['list-sort-code']);
    })
}, // OC.Shorty.Runtime.Context.ListOfShortys.ListAddInsert

中央には、すべて「OC.Shorty.WUI.Sums.fill.apply」で始まる5行が表示されます。これらの行は、セミコロン( ";")ではなくコンマ( "、")で終了します。なぜそれが構文エラーとして表示されなかったのですか?

4

3 に答える 3

1

基本的に、コンマ演算子は複数の式をグループ化し、最後の式の値を表します。あなたの場合、それを省略してもかまいません。

あなたがこのコードを持っていると想像してください:

1
2
3

これは完全に有効なJavaScriptコードです。数字は、3つの任意の式を示すためだけにあります。

次のことを行う場合:

var expression_value = 1
2
3

expression_value値があります1

コンマ演算子と括弧を使用する場合:

expression_value = (1,
2,
3)

3コンマ演算子は右端の式から値を返すため、値はになります。

括弧を使用しない場合、次の括弧が暗示されます

implied = ((expression_value = 1),
2,
3)

expression_valueその場合、値は。になりますが1implied(つまり、式全体)の値は3になります。

于 2012-08-03T11:37:46.600 に答える
1

この構文では、コンマ演算子を使用しています,。すべてのオペランドを評価し、最後のオペランドの値を返します。

このスタイルのコーディングを使用する理由は、コードをすばやくまたは1行で実行できるようにするためです。次に例を示します。

var a = 0,
    b = 1,
    c;

c = ( a++, b++, a + 2 ); // a is incremented, b is incremented, then c is assigned a + 2

a; // 1
b; // 2
c; // 3
于 2012-08-03T11:37:58.600 に答える
1

コンマ演算子はシーケンスをマークします。JSは、コードを解析可能にするために必要な場合にのみ、行末に追加の';'を挿入します。したがって、次のようなコード

alert("hi"),
alert("there"),
alert("bob") // no semi-colon here

完全に有効です-それは次のように理解されます

alert("hi"),
alert("there"),
alert("bob"); // notice the semi-colon

(違法)の代わりに

alert("hi"),;
alert("there"),;
alert("bob");

ただし、セミコロンの自動挿入に依存することは悪いスタイルと見なされます。

于 2012-08-03T11:41:23.227 に答える