为什么
if (prev = this.Prev()) {
...
}
工作但是
if (var prev = this.Prev()) {
...
}
没有? this.Prev()是一个Point对象的方法,如果它存在则返回对前一个Point的引用,如果不存在则返回false。我不想将变量声明为全局变量,我不想要像:
这样冗长的东西var prev = this.Prev();
if (prev) {
...
}
编辑:做我喜欢的事情最优雅的方式是什么?
答案 0 :(得分:10)
这是因为if
statement需要表达式:
<强>语法:强>
IfStatement :
if ( Expression ) Statement else Statement
var
是一个声明,这就是为什么你得到SyntaxError
。
您的第一个示例有效,因为作业是表达式(AssignmentExpression)
修改强> 让我引用这一部分:
我不想将变量声明为全局
我理解您的担忧,对未声明的标识符进行的分配最终可能会在全局对象上创建属性,而且使用ECMAScript 5th Strict Mode,未声明的分配将导致ReferenceError
,从而破坏你的代码
JavaScript中的变量在实际代码执行之前被声明为,所有出现的var
语句都绑定到当前的变量对象,并且它们被初始化使用undefined
,您无法有条件地声明变量。
答案 1 :(得分:1)
C'est la vie。 JavaScript不允许你在那里声明变量。
(这是一个布尔表达式,而不是一个语句)
答案 2 :(得分:1)
你说“我不想声明变量是全局的”。但是,请记住,JavaScript没有块范围,只有函数范围。因此,即使可能,也不允许您更改变量的范围(不是@CMS pointed out)。
JavaScript没有块范围,因此在块中定义变量会使经验丰富的程序员与其他C族语言混淆。定义函数顶部的所有变量。
答案 3 :(得分:0)
这是因为您不能将完整的以关键字为前缀的语句用作表达式。有些语句,比如那些没有关键字前缀的语句,可以很容易地用作没有错误的表达式。