我亲眼目睹了JavaScript中的这种行为,但我不知道如何搜索它的原因,所以我有以下问题.
据我所知,多行语句在JavaScript中工作,例如:
var text = "abc" +
"xyz";
Run Code Online (Sandbox Code Playgroud)
但是当它是这样的时候:
// returns undefined
return
"some text";
Run Code Online (Sandbox Code Playgroud)
野应!它回来了undefined.
这是一个应该返回字符串的基本语句.但是这个版本不能像我期望的那样工作.
那么我们在这里遇到了什么?我只是好奇.
问题是自动分号插入的恐怖.JavaScript的ASI规则将在;之后插入return,为您提供:
return;
"some text";
Run Code Online (Sandbox Code Playgroud)
这似乎很奇怪,但它是有效的 - 它没有return任何值,因此函数调用返回undefined,然后在函数的末尾有一个表达式(这是有效的,但什么都不做).
您可以通过执行您所做的操作(将其全部放在一行上)来修复它,这是我建议的,或者更改它以便ASI规则不会启动,例如使用parens:
return (
"some text"
);
Run Code Online (Sandbox Code Playgroud)
(我不是主张使用parens,只是说它可以解决这个问题.)
在评论中,您已经询问了当您不希望换行时换行可能触发ASI的其他情况.它们是相当罕见的,后来return是迄今为止最大的新线.这是另一个例子:
return
{
result: "success"
};
Run Code Online (Sandbox Code Playgroud)
在那里,作者意味着返回一个对象,但却成了同样的ASI错误的牺牲品.
这里的外卖信息是:如果你要归还某些内容,请将其开头放在与之相同的行上return.这消除了ASI导致问题的绝大多数情况.
Axel Rauschmayer有一篇关于ASI 的好文章,以及何时/为什么它会在他的博客上开始(值得关注).它唯一的非返回示例是:
a
++
c
Run Code Online (Sandbox Code Playgroud)
......触发ASI并成为
a;
++
c
Run Code Online (Sandbox Code Playgroud)
......但是原版开头很狡猾.:-)
| 归档时间: |
|
| 查看次数: |
50 次 |
| 最近记录: |