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

在中间,您会看到 5 行都以“OC.Shorty.WUI.Sums.fill.apply”开头。这些行以逗号 (",") 结束,而不是分号 (";")。为什么这没有显示为语法错误?

4

3 回答 3

1

基本上,逗号运算符将多个表达式组合在一起,它们表示最后一个表达式的值。在您的情况下,您也可以省略它。

想象一下你有这样的代码:

1
2
3

这是完全有效的 JavaScript 代码。这些数字只是用来表示三个任意表达式。

如果您要执行以下操作:

var expression_value = 1
2
3

expression_value将具有价值1

如果您使用逗号运算符和括号:

expression_value = (1,
2,
3)

它将具有 value 3,因为逗号运算符从最右边的表达式返回值。

如果您不使用任何括号,则将隐含以下括号:

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

expression_value然后将具有 的值1,但implied(即整个表达式)现在将具有 3 的值。

于 2012-08-03T11:37:46.600 回答
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 回答