2012-08-03 43 views
0

我只是在我的一個簡單的Web應用程序中修復了一些錯誤,並且偶然發現了一些有趣的線條。 我不記得我爲什麼以這種方式來實現這些行。現在我將它們改爲「正常」語法,一切正常。 我的問題出於好奇:爲什麼這個方法可以工作?我希望有一個語法錯誤,但事實並非如此。代碼確實有效。JavaScript中的逗號運算符:預計會出現語法錯誤,但代碼運行正常

這是舊方法實現:

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 

在中間,你看5日線都開始以「OC.Shorty.WUI.Sums.fill.apply」。這些行以逗號(「,」)而不是分號(「;」)結尾。爲什麼這不會顯示爲語法錯誤?

+0

可能重複的[Javascript語法:什麼逗號的意思?](http://stackoverflow.com/questions/3561043/javascript-syntax-what-c​​omma-means) – 2012-08-03 11:41:19

回答

1

基本上,comma operator將多個表達式組合在一起,它們表示最後一個表達式的值。就你而言,你可以忽略它。

想象一下,你有這樣的代碼:

1 
2 
3 

這是完全有效的JavaScript代碼。數字就在那裏表示三個任意表達式。

如果你要做到以下幾點:

var expression_value = 1 
2 
3 

expression_value將具有價值1

如果用逗號和括號:

expression_value = (1, 
2, 
3) 

它的值將3,因爲逗號操作符返回從最右邊表達式的值。

如果你不使用任何括號,以下括號將暗示

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

expression_value隨後將有1值,但implied(即整個表達)現在會值爲3.

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 
+0

我認爲'加'你的意思是'遞增' ? – arkascha 2012-08-03 11:53:40

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"); 

依託自動插入-的-分號被認爲是bad style,但。