我不知道该怎么回答我的学生

时间:2013-12-03 08:44:10

标签: javascript

我的学生都是初学者。

当我教他们JavaScript时,我向他们展示了这个函数声明:

function test() {
  /* code */
}

然后我向他们展示了你可以直接在Webbrowser的控制台中输入一些内容。 然后我向他们展示算术运算:1+26*3等等。

我的一个学生让我试试这个,我很确定它不会起作用,但确实如此:

function test() {
  1+3;
}

我能说些什么来解释这个? 当您在命令行中输入一些赋值时,我会说什么,例如var i=5;返回结果为undefined

4 个答案:

答案 0 :(得分:8)

与其他语言不同,JavaScript允许表达式作为语句,请参阅规范的§12.4 (“表达式语句”)。所以代码是有效的,它没有任何持久的效果。

这与以下原因相同:

foo && foo();

这是一个独立的表达,就像你的1+3;一样。在这种情况下,当然,仅当foo不是假的时候才会调用foo

Philipp在评论中指出ECMAScript5的"use strict";是另一个例子。从技术上讲,它在ECMAscript5中是指令,但它适用于ECMAScript5之前的引擎,因为它们看起来像表达式语句。

  

当你在命令行中输入一些赋值时我能说什么,比如var i=5;返回结果是未定义的?

因为语句没有结果,只有表达式。 varstatement。如果你单独完成它们,你会得到这个:

> var i;
undefined
> i=5;
5

...因为赋值表达式的结果是赋值的值。

答案 1 :(得分:1)

当您在浏览器控制台中输入内容时,您正在创建一个javascript Program(即使它与3+2一样小,它仍然是一个程序)。程序是StatementFunctionDeclaration 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() { });