Javascript - var如何有所作为?

时间:2016-02-15 09:37:39

标签: javascript var

请参阅以下代码段。 第一个错误,这是预期的。 第二个过去了。这两个片段的原因或区别是什么。

<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <WrapPanel Orientation="Horizontal" MaxWidth="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBox}},Path=ActualWidth}"/>
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>

3 个答案:

答案 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(或constlet等,如果你编写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