Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.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 - Fatal编程技术网

javascript-行为的解释请求

javascript-行为的解释请求,javascript,Javascript,我从JavaScript中看到了这种行为,我觉得很有趣,但我不知道如何搜索其原因,所以我有以下问题 据我所知,多行语句在JavaScript中工作,例如: var text = "abc" + "xyz"; return { result: "success" }; 但如果是这样的话: // returns undefined return "some text"; 不!它返回未定义的 这是一个基本语句,它应该返回一个字符串。但是这个版本并不像我预期的那样工作 那么,我们在这

我从JavaScript中看到了这种行为,我觉得很有趣,但我不知道如何搜索其原因,所以我有以下问题

据我所知,多行语句在JavaScript中工作,例如:

var text = "abc" + 
"xyz";
return
{
     result: "success"
};
但如果是这样的话:

// returns undefined
return 
"some text";
不!它返回未定义的

这是一个基本语句,它应该返回一个字符串。但是这个版本并不像我预期的那样工作


那么,我们在这里经历了什么?我只是好奇。

问题在于这是一种恐怖。JavaScript的ASI规则将插入一个
返回
后的code>,为您提供以下信息:

return;
"some text";
这看起来很奇怪,但它是有效的-它执行一个没有值的
返回
,因此函数调用返回
未定义的
,然后在函数末尾有一个表达式(它是有效的,但不做任何事情)

你可以通过做你所做的(把它全部放在一行)来修复它,这是我的建议,或者改变它,使ASI规则不会生效,例如使用parens:

return (
    "some text"
);
(我并不提倡使用parens,只是说它可以解决问题。)

在一篇评论中,你问过当你不希望新行触发ASI时,会出现哪些其他情况。它们是相当罕见的,newline after
return
是迄今为止最大的一个。下面是另一个例子:

var text = "abc" + 
"xyz";
return
{
     result: "success"
};
在那里,作者打算返回一个对象,但却受到了与代码相同的ASI错误的影响

这里的外卖信息是:如果您要返回某些内容,请将其开头与
return
放在同一行。这消除了ASI引起问题的绝大多数情况

Axel Rauschmayer在他的博客(值得关注)上有关于ASI以及它何时/为什么会出现的内容。它的唯一非返回示例是:

a
++
c
…触发ASI并成为

a;
++
c

…但最初的版本非常狡猾。:-)

return语句返回/结束对程序的函数或事件处理程序的控制。所以在此之后,它不会执行下一条语句。空的return语句未定义,而不是下一行的字符串。

hmm,所以它只会在
返回后发生?@TolgaEvcimen:不仅如此,这是最常见的地方之一。我明白了。现在我只是好奇,什么样的情况会导致这种行为:)谢谢你的全面回答。@TolgaEvcimen不,不是。阅读他帖子中的链接规范。@TolgaEvcimen:非常奇怪!这是正确的,但它不能解释为什么return语句为空。是的,这是由于自动插入分号造成的。这一点被遗漏了。T.J.CrowderAs解释得很好,他在规范中说,如果return语句后没有表达式,将返回一个未定义的值:Syntax ReturnStatement:return;返回[no LineTerminator here]表达式;语义如果ECMAScript程序包含不在FunctionBody中的返回语句,则认为它在语法上不正确。return语句导致函数停止执行并向调用方返回值。如果省略表达式,则返回值未定义。否则,返回值为表达式的值。