为什么我可以'if(a = 7)......'而不是'if(var a = 7)......'?

Nic*_*ick 1 javascript

为什么

if (prev = this.Prev()) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

工作但是

if (var prev = this.Prev()) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

才不是?this.Prev()是一个Point对象的方法,如果它存在则返回对前一个Point的引用,如果不存在则返回false.我不想声明变量是全局的,我不想要像下面这样冗长的东西:

var prev = this.Prev();
if (prev) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

编辑:什么是最优雅的方式来做我喜欢的事情?

CMS*_*CMS 10

这是因为if语句需要一个表达式:

句法:

IfStatement :
    if ( Expression ) Statement else Statement 
Run Code Online (Sandbox Code Playgroud)

var是一个声明,这就是为什么你得到一个SyntaxError.

您的第一个示例有效,因为赋值是一个表达式(AssignmentExpression)

编辑: 让我引用这一部分:

我不想将变量声明为全局变量

我理解您的担忧,对未声明的标识符的分配可能最终在全局对象上创建属性,而且使用ECMAScript第5 严格模式,未声明的分配将导致ReferenceError破坏您的代码

JavaScript中的变量在实际代码执行之前声明,所有出现的var语句都绑定到当前的变量对象,并且它们被初始化undefined,您无法有条件地声明变量.