请参阅以下代码段。 第一个错误,这是预期的。 第二个过去了。这两个片段的原因或区别是什么。
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" MaxWidth="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBox}},Path=ActualWidth}"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
答案 0 :(得分:8)
在第一行中,您用逗号(Variable Statement)分隔声明,这里缺少一个变量名。
第二行正在使用Comma Operator,即使没有必要,也能正常工作。
问题出现了
如果second是逗号运算符,那么myvar2中的值将是4.但它是3!
这是因为逗号的Operator Precedence与平等。进行分配,稍后评估逗号。
答案 1 :(得分:2)
第一行基本上转化为:
var myvar = 4,
7
因此“第二行”会抛出错误,因为JavaScript解释器希望您想要分配两个变量,但找不到第二个变量的名称。例如,您可以像这样分配变量
var first = 0,
obj = {},
s = "my string",
array = [1,2,3,4,5];
没有错误,因为它是有效的JavaScript,并且每个值都有一个变量名称,因此可以将其分配给。
在第二个示例中,您只分配最后一个数字 - 没有var
关键字JavaScript不会抛出错误并只分配第一个值。这有点像写下面的
myvar = 3
4
因此分配了第一个值。我以前混淆了这一点(见历史)。将myvar = 3,4
传递给控制台时,看起来会分配4,但它只是打印到控制台中 - 换句话说,评估了,
后面的部分。将以下内容粘贴到控制台
myvar = 3, _this_function_doesnt_exist()
此处解析器将抛出错误:Uncaught ReferenceError: _this_function_doesnt_exist is not defined(…)
- 前一个表达式(myvar = 3
)仍在执行,因此myvar
将为3。
我以前只用一个var
关键字编写了我的所有变量,但发现它相当令人困惑和丑陋。一般来说,我建议每行使用一个分配,并在每个变量前面var
(或const
,let
等,如果你编写ECMAScript 2015 / ES6)
答案 2 :(得分:0)
在Nina Schloz
回答
var myvar = 4, 7 // throws Uncaught SyntaxError: Unexpected number
// Because declared variables are hoisted to the top of the scope,this translates to
/*
var myvar;
var 7; // throws Uncaught SyntaxError: Unexpected number
myvar = 4; // this never gets executed
*/
var anotherVar = 4, x; // this doesn't throw an error
// this translates to
/*
var anotherVar;
var x;
anotherVar=4;
*/
当我们执行myvar2=3,4
时,我们使用comma operator
首先将{3}分配给undeclared variable myvar2
,然后返回表达式的最后一个值(从左到右),即数字4