我的学生都是初学者。
当我教他们JavaScript时,我向他们展示了这个函数声明:
function test() {
/* code */
}
然后我向他们展示了你可以直接在Webbrowser的控制台中输入一些内容。
然后我向他们展示算术运算:1+2
,6*3
等等。
我的一个学生让我试试这个,我很确定它不会起作用,但确实如此:
function test() {
1+3;
}
我能说些什么来解释这个?
当您在命令行中输入一些赋值时,我会说什么,例如var i=5;
返回结果为undefined
?
答案 0 :(得分:8)
与其他语言不同,JavaScript允许表达式作为语句,请参阅规范的§12.4 (“表达式语句”)。所以代码是有效的,它没有任何持久的效果。
这与以下原因相同:
foo && foo();
这是一个独立的表达,就像你的1+3;
一样。在这种情况下,当然,仅当foo
不是假的时候才会调用foo
。
Philipp在评论中指出ECMAScript5的"use strict";
是另一个例子。从技术上讲,它在ECMAscript5中是指令,但它适用于ECMAScript5之前的引擎,因为它们看起来像表达式语句。
当你在命令行中输入一些赋值时我能说什么,比如
var i=5;
返回结果是未定义的?
因为语句没有结果,只有表达式。 var
是statement。如果你单独完成它们,你会得到这个:
> var i; undefined > i=5; 5
...因为赋值表达式的结果是赋值的值。
答案 1 :(得分:1)
当您在浏览器控制台中输入内容时,您正在创建一个javascript Program
(即使它与3+2
一样小,它仍然是一个程序)。程序是Statement
和FunctionDeclaration
s的序列,由(可能隐含的)分号分隔。 JS按顺序评估所有语句和声明,整个Program
的结果是最后一个非空结果。虽然FunctionDeclaration
始终产生空值(undefined
),但某些Statement
可以返回非空结果。这些列在标准(http://ecma-international.org/ecma-262/5.1/#sec-12)的“语句”部分中,查找类似
Return (normal, V, empty) or Return (normal, empty, empty)
其中中间部分表示语句的返回值。
示例:
> var a=1; function x() { 3+1 }
undefined
这不会返回任何内容,因为nether var
语句和decl都没有值。
> 3 + 2
5
这将返回5
,因为表达式语句具有值。
> function x() { 3 + 2 }
undefined
这是未定义的,因为FunctionDeclaration
没有值。
> var a = 10; while(a>3) a--; function x() {}
4
这个返回4
,因为while
确实有值。
> var a = 10; if(a>3) a--
10
if
也是如此。
请注意,虽然大多数JS语句都有值,但是没有办法在JS程序中获取或使用这些值(除了eval()
,控制台会在其中进行操作)。正在评估陈述,但其结果会丢失,而陈述的唯一真正目的是产生副作用。这种有点奇怪的行为是Javascript作为一种功能语言(其中一切都有价值)和程序语法的结果。换句话说,在语义上允许像
return if(a > 10) 5 else 0
或
x = 5 + do { r = nextVal() } while(!used(r))
这不起作用的唯一原因是语法上的任意限制。
答案 2 :(得分:0)
这是Expression statement,在javascript中完全合法
所有表达式都有一个返回值,所以:
i = 5 // this is an expression and a statement, returns 5
但并非所有语句都是表达式,因此它们可能没有返回值。
var i= 5; // this is a statement, NOT an expresion, returns undefined
答案 3 :(得分:0)
您只需返回您计算的值并实际调用该函数,如下所示:
function test() {
return 1+3;
}
test();
你所做的是在你的函数中创建一个评估为4
的表达式,但没有发生任何事情。由于您未在test()
函数中返回任何内容,因此会按预期返回undefined
。你也没有调用它,所以它将返回最后一个语句的结果。但是它不仅仅返回您创建的函数,因为您只声明了它。如果你想要函数对象本身,你需要在它周围包括括号或稍后访问它,如下所示:
function test() { }
test;
或者
(function test() { });