Javascript 为什么我可以做';如果(a=7)';但不是';如果(var a=7)';?

Javascript 为什么我可以做';如果(a=7)';但不是';如果(var a=7)';?,javascript,Javascript,为什么 if (prev = this.Prev()) { ... } 工作但是 if (var prev = this.Prev()) { ... } 不是吗?this.Prev()是一个Point对象的方法,它返回对上一个点的引用(如果该点存在),如果不存在则返回false。我不希望将变量声明为全局变量,也不希望出现诸如以下内容之类的冗长内容: var prev = this.Prev(); if (prev) { ... } 编辑:做我正在尝试的事情最优雅的方

为什么

if (prev = this.Prev()) {
    ...
}
工作但是

if (var prev = this.Prev()) {
    ...
}
不是吗?this.Prev()是一个Point对象的方法,它返回对上一个点的引用(如果该点存在),如果不存在则返回false。我不希望将变量声明为全局变量,也不希望出现诸如以下内容之类的冗长内容:

var prev = this.Prev();
if (prev) {
    ...
}
编辑:做我正在尝试的事情最优雅的方式是什么?

发生这种情况是因为需要一个表达式:

语法:

IfStatement :
    if ( Expression ) Statement else Statement 
是一条语句,这就是为什么会出现
SyntaxError

第一个示例之所以有效,是因为赋值是表达式()

编辑: 让我引述这部分:

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

我理解您的担忧,对未声明标识符的赋值可能最终会在全局对象上创建属性,而且对于ECMAScript 5th,未声明的赋值将导致
引用错误
,从而破坏您的代码

JavaScript中的变量是在实际代码执行之前声明的,所有出现的
var
语句都绑定到当前变量对象,并且它们是用
undefined
初始化的,您不能真正有条件地声明变量。

发生这种情况是因为需要一个表达式:

语法:

IfStatement :
    if ( Expression ) Statement else Statement 
是一条语句,这就是为什么会出现
SyntaxError

第一个示例之所以有效,是因为赋值是表达式()

编辑: 让我引述这部分:

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

我理解您的担忧,对未声明标识符的赋值可能最终会在全局对象上创建属性,而且对于ECMAScript 5th,未声明的赋值将导致
引用错误
,从而破坏您的代码


JavaScript中的变量是在实际代码执行之前声明的,所有出现的
var
语句都绑定到当前的变量对象,并使用
undefined
进行初始化,您不能真正有条件地声明变量。

C'est la vie。JavaScript不允许在那里声明变量


(这是一个布尔表达式,而不是一个语句)

C'est la vie。JavaScript不允许在那里声明变量


(这是一个布尔表达式而不是语句)

这是因为不能将带有完整关键字前缀的语句用作表达式。有些语句,例如那些没有关键字前缀的语句,可以很容易地用作表达式而没有错误。

这是因为不能将完整的关键字前缀语句用作表达式。有些语句,比如那些没有关键字前缀的语句,可以很容易地用作没有错误的表达式。

您说“我不想将变量声明为全局变量”。但是,请记住,JavaScript没有块作用域,只有函数作用域。因此,这将不允许您更改变量的范围,即使这是可能的(事实并非如此)

:

JavaScript没有块作用域,因此在块中定义变量可能会使熟悉其他C族语言的程序员感到困惑。在函数顶部定义所有变量

您会说“我不想将变量声明为全局变量”。但是,请记住,JavaScript没有块作用域,只有函数作用域。因此,这将不允许您更改变量的范围,即使这是可能的(事实并非如此)

:

JavaScript没有块作用域,因此在块中定义变量可能会使熟悉其他C族语言的程序员感到困惑。在函数顶部定义所有变量


好的,谢谢。你认为最干净的处理方法是什么?类似这样的东西.IfPrev(函数(prev){…})?(我想在过去的几周里,你已经回答了我所有的javascript问题,哈哈)。我相信我能理解这一点。。我在想,如果(var prev=this.prev())失败,那么在当前函数作用域中仍然会有一个名为“prev”的变量,该变量的值为“false”。但是由于这种语法是无效的,这一点是没有意义的。@Nick,我认为你的最后一个例子还不错,你评论的回调方法对于一件简单的事情来说有点过分了。我建议你保持简单;)好的,谢谢。你认为最干净的处理方法是什么?类似这样的东西.IfPrev(函数(prev){…})?(我想在过去的几周里,你已经回答了我所有的javascript问题,哈哈)。我相信我能理解这一点。。我在想,如果(var prev=this.prev())失败,那么在当前函数作用域中仍然会有一个名为“prev”的变量,该变量的值为“false”。但是由于这种语法是无效的,这一点是没有意义的。@Nick,我认为你的最后一个例子还不错,你评论的回调方法对于一件简单的事情来说有点过分了。我建议你保持简单;)哦,不,我在第一个示例中的意思是,省略“var”将创建变量作为窗口的属性,这不是预期的结果。@尼克:是的,你说得对。。。但最后一个例子有什么问题?为什么太冗长了?嗯,我想还不错。我想我只是习惯了其他编程语言的语法,一开始看起来很难看。哦,不,我在第一个例子中的意思是,省略“var”将创建变量作为窗口的属性,这不是预期的结果。@Nick:是的,你是对的。。。但最后一个例子有什么问题?为什么太冗长了?嗯,我想还不错。我想我只是习惯了其他编程语言的语法,一开始看起来很难看。它不是愚蠢的冗长,它长了四个字符。它不是愚蠢的冗长,它是四个字符