为什么常规赋值语句(比如x = 5
)返回赋值的值(在这种情况下为5
),而赋值与变量声明(var x = 5
)一起返回{ {1}}?
我通过在Chrome浏览器的Javascript控制台中执行这些语句获得了返回值:
undefined
答案 0 :(得分:31)
这就是语言的设计方式。它与大多数语言一致。
让变量声明返回undefined
以外的任何内容都是没有意义的,因为你不能在表达式上下文中使用var
关键字。
如果您希望一次将多个变量设置为相同的值,则将分配设为expression
而不是statement
非常有用:
x = y = z = 2;
它也可以像这样使用:
x = 2*(y = z); // Set y = z, and x = 2*z
然而,这不是最易读的代码,它可能更好地写为:
y = z;
x = 2*z;
答案 1 :(得分:6)
那是因为var x = 5;
是变量语句,而不是表达式。
Section 12.2 of the ECMAScript Language Reference中描述了此语句的行为。
- 评估VariableDeclarationList。
- 返回(正常,空,空)。
醇>
这基本上是void
返回值。
答案 2 :(得分:3)
赋值运算符(即等号)(1)将右侧操作数(即,变量,属性或函数的值或值)赋给左侧操作数(即,然后(2)赋值表达式(例如,y = 10)在评估表达式的其余部分之前变为具有与其右侧操作数(例如,10)相同的值的简单操作数。这类似于在计算表达式时将被调用的函数替换为其返回值的情况(尽管函数调用首先按操作顺序排列,赋值操作是第14行):
var x, y, z = 1;
x = z + (y = 2); // x === 3
function returnTwo () {
return 2;
}
x = z + returnTwo(); // x === 3
请注意,x现在不仅等于3,而且整个表达式的计算结果为3。
var
关键字的目的是将变量绑定到当前范围。使用var
关键字声明的变量将绑定到声明它们的范围。 var
关键字将最左侧的变量(或属性)指定为对已计算表达式的值的引用:
var fun = function () {
var x = 1;
var y = x + 1;
return y;
}
// The x and y variables are bound to the scope of the fun function.
将var
关键字与表达式一起使用称为声明。声明是不评估值的操作,甚至未定义(即使您的控制台打印未定义)。此外,声明不能出现在JavaScript期望表达式的位置,正如此帖的其他答案所示。
答案 3 :(得分:1)
当你写var x = 5;
时,它会声明x
并将其值初始化为5.
这是VariableStatement
,它什么都不返回,
但是x=5
是一个expression
,它将x分配给5。
因为没有x
,JavaScript会在正常代码中隐式创建全局x
答案 4 :(得分:0)
由于评论和其他一些答案,我编辑了我的答案。
赋值运算符不会返回任何内容...在下面的示例中,JS解析器的第一件事就是将y分配给5。第二件事是将y分配给x,依此类推。分配不是return
(它不是函数,而在JS中它没有C ++语法来重载运算符的行为)。 return
比分配更复杂。 return
构造不仅返回一个值,而且关闭当前上下文,导致它被销毁。如果没有其他孩子使用它,它也会关闭任何父上下文(闭包模式)。所以,请不要告诉我(在评论中)赋值运算符返回任何值。 JS中的赋值运算符只是一种语言结构。
这种语言结构在链中很有用(这就是每个人都在讨论返回的原因):
a = x = y = 5;
任何未声明的变量都由全局范围内的解析器自动声明。如果明确声明变量,那么你不能同时在链中使用它,如下所示:
a = var x = y = 5;
正确使用上述代码将是:
var x = y = 5;
a = x;
当然你可以使用括号来使你的代码更清晰,但这并不意味着代码的行为就像一个函数。
此外,您的示例仅适用于JS控制台,它不会返回,而是打印语句或表达式的结果。这意味着JS控制台将变量声明的结果视为undefined
(创建函数时相同:function a() {}
)。