Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么类型的';返回';关键词?_Javascript_Return_Keyword - Fatal编程技术网

Javascript 什么类型的';返回';关键词?

Javascript 什么类型的';返回';关键词?,javascript,return,keyword,Javascript,Return,Keyword,我们可以选择在JavaScript函数中使用语句。这是一个关键词。但是返回本身的实际类型是什么呢。事实上,看到这个例子,我很困惑: function add(a, b) { return ( console.log(a + b), console.log(arguments) ); } add(2, 2); 输出: 4 [2, 2] 因此,我们可以将逗号分隔的表达式传递到return语句中。这是一个函数吗 从这里开始,我们可以猜测JavaScript中的每个关键字最

我们可以选择在JavaScript函数中使用语句。这是一个关键词。但是
返回本身的实际类型是什么呢。事实上,看到这个例子,我很困惑:

function add(a, b) {
  return (
    console.log(a + b),
    console.log(arguments)
  );
}

add(2, 2);
输出:

4
[2, 2]
因此,我们可以将逗号分隔的表达式传递到
return
语句中。这是一个函数吗

从这里开始,我们可以猜测JavaScript中的每个关键字最终都是一个函数吗

我写了一个小博客作为这次讨论的要点。你可能想检查一下

但“回报”本身的实际类型是什么

它没有类型,也不是值

尝试
返回类型
将给您
意外的令牌返回

因此,我们可以将逗号分隔的表达式传递到return语句中。这是一个函数吗

不,虽然括号可以用来调用函数,但在这里它们是一个包含两个表达式的函数,用一个分隔

更有用的示范是:

function add(a, b) {
  return (
    (a + b),
    (a - b)
  );
}

console.log(add(2, 2));

它输出
0
,因为
a+b
的结果被忽略(它位于逗号运算符的左侧),并返回
a-b

测试返回括号中的值时会发生什么:

function foo() {
    return (1, 2);
}

console.log(foo());
给出答案
2
,因此以逗号分隔的值列表的计算结果似乎是列表中的最后一个元素

实际上,括号在这里是不相关的,它们是分组操作,而不是表示函数调用。然而,可能令人惊讶的是,逗号在这里是合法的。我在这里发现了一篇有趣的关于逗号如何处理的博文:


返回
不是一个函数。它是它发生的函数的延续

想想这句话
alert(2*foo(bar))其中
foo
是函数名。当您对它进行评估时,您会发现必须将语句的其余部分暂时放在一边,以便集中精力评估
foo(bar)
。您可以将您放在一边的部分可视化为类似于
alert(2*)
,并填充一个空白。当您知道
foo(bar)
的值是多少时,您可以再次选择它

你所搁置的是继续调用
foo(bar)

调用
return
为该延续提供一个值

当您在
foo
中计算一个函数时,
foo
的其余部分等待该函数减小为一个值,然后
foo
再次拾取。您仍然有一个评估
foo(bar)
的目标,它只是暂停了

当您在
foo
内部计算
return
时,
foo
的任何部分都不会等待值
return
不会在您使用它的
foo
中的某个位置降低到某个值。相反,它会导致整个调用
foo(bar)
减少到一个值,并且目标“evaluate
foo(bar)
”被视为已完成并被吹走


当你刚开始编程时,人们通常不会告诉你关于续集的事情。他们认为这是一个高级的话题,只是因为人们最终会用延续来做一些非常高级的事情。但事实是,每次调用函数时,都会一直使用它们

返回
这里是一条红鲱鱼。可能有以下变化:

function add(a, b) {
  return (
    console.log(a + b),
    console.log(arguments)
  );
}

console.log(add(2, 2));
哪个输出作为最后一行

undefined
因为函数实际上不返回任何内容。(如果有第二个
控制台.log
,它将返回该控制台的返回值)

实际上,代码与

function add(a, b) {
    console.log(a + b);
    console.log(arguments);
}

console.log(add(2, 2));

我有点震惊,这里没有人直接提到:

12.9返回语句语法ReturnStatement:return;返回[no LineTerminator here]表达式

语义

如果ECMAScript程序 包含不在FunctionBody中的返回语句。A. return语句导致函数停止执行并返回 将值传递给调用方。如果省略表达式,则返回值为 未定义。否则,返回值为表达式的值

ReturnStatement的评估如下所示:

Let lref be the result of evaluating Expression.
Call GetValue(lref).
Let rref be the result of evaluating AssignmentExpression.
Return GetValue(rref).
如果表达式不存在,则返回
(返回,未定义,为空)
。 让
exprRef
作为表达式求值的结果。 Return
(Return,GetValue(exprRef),空)

因此,由于规范的原因,您的示例如下:

return(GetValue(exprRef))

在哪里
exprRef=console.log(a+b),console.log(参数)

根据

语义

生产表达式:表达式,AssignmentExpression为 评价如下:

Let lref be the result of evaluating Expression.
Call GetValue(lref).
Let rref be the result of evaluating AssignmentExpression.
Return GetValue(rref).
…表示将对每个表达式求值,直到逗号列表中的最后一项成为赋值表达式为止。因此,您的代码
返回(console.log(a+b)、console.log(arguments))

1.)打印
a+b的结果

2.)没有什么要执行的了,所以执行下一个表达式

3.)打印
参数
,因为
console.log()
没有指定 返回语句

4.)计算为未定义

5.)然后返回给调用方

因此正确的答案是,
return
没有类型,它只返回某个表达式的结果

关于下一个问题:

因此,我们可以将逗号分隔的表达式传递到return语句中。 这是一个函数吗

不可以。JavaScript中的逗号是一个运算符,定义为允许您将多个表达式组合到一行中,并且由规范定义为返回列表中最后一个表达式的计算表达式

你还是不相信我

<script>
alert(foo());
function foo(){
    var foo = undefined + undefined;
    console.log(foo);
    return undefined, console.log(1), 4;
}
</script>

警报(foo());
函数foo(){