我刚刚在我的一个简单的网络应用程序中修复了一些错误,偶然发现了一些有趣的行。 我不记得为什么我按照那样的方式实现这些线。现在我将它们改为“普通”语法,一切都很好。 我的问题只是出于好奇:为什么这个方法有效?我希望语法错误,但事实并非如此。代码确实有效。
这是旧方法实现:
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 :(得分:1)
基本上,comma operator将多个表达式组合在一起,它们代表 last 表达式的值。在你的情况下,你也可以省略它。
想象一下,你有这段代码:
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 :(得分: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
答案 2 :(得分: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。