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

时间:2010-08-15 04:37:50

标签: javascript

为什么

if (prev = this.Prev()) {
    ...
}

工作但是

if (var prev = this.Prev()) {
    ...
}

没有? this.Prev()是一个Point对象的方法,如果它存在则返回对前一个Point的引用,如果不存在则返回false。我不想将变量声明为全局变量,我不想要像:

这样冗长的东西
var prev = this.Prev();
if (prev) {
    ...
}

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

4 个答案:

答案 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)。

Quoting Douglas Crockford

  

JavaScript没有块范围,因此在块中定义变量会使经验丰富的程序员与其他C族语言混淆。定义函数顶部的所有变量。

答案 3 :(得分:0)

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