当前位置: 首页 > 面试题库 >

自动分号插入和返回语句

左丘曦
2023-03-14
问题内容

如您所知,ECMAscript会尝试变得聪明,如果您未明确编写 分号 ,则会自动插入 分号 。简单的例子

function foo() {
    var bar = 5

    return bar
}

仍将按预期工作。但是,如果您依靠这一点,则有一些警告。如果我们像这样重写该函数

function foo() {
    var bar = 5

    return
    {
        bar: bar
    }
}

..那个函数现在将返回,undefined因为解释器将在return语句之后插入分号(这就是为什么始终将大括号放在与语句相同的行上的原因)。

但是,了解了所有这些之后,我现在想知道在所有浏览器和版本中,如下所示的语句的 安全性 如何return

function foo() {
    var a = true,
        b = true,
        c = false;

    return a 
            && b
            && c;
}

我只是return statement在生产环境中写过类似的文章。仅仅因为我知道ECMAscript的“问题”而对分号插入不是那么聪明,我现在想知道,该代码是否100%有效。在我对FF
/ Chrome / IE(最新版本)的首次测试中,这似乎完全可以,但是真的吗?

如果除了该行中的语句以外, 自动分号插入 是否会“唤醒” return?任何人都可以提供有关实现的详细信息吗?


问题答案:

javascript解释器/编译器非常聪明,仅在之后有有效的Javascript时才插入自动分号。

您的代码可以正常工作,因为&&b它本身没有有效的表达式-这就是为什么在returna生成以下结果后不插入分号的原因:

return a && b && c;

然而:

return (undefined);//implicitely inserted
{
    ....
}

完全有效,这就是为什么要插入分号的原因。



 类似资料:
  • 尽管 JavaScript 有 C 的代码风格,但是它不强制要求在代码中使用分号,实际上可以省略它们。 JavaScript 不是一个没有分号的语言,恰恰相反上它需要分号来就解析源代码。 因此 JavaScript 解析器在遇到由于缺少分号导致的解析错误时,会自动在源代码中插入分号。 var foo = function() { } // 解析错误,分号丢失 test() 自动插入分号,解析器重

  • 本文向大家介绍浅析Javascript的自动分号插入(ASI)机制,包括了浅析Javascript的自动分号插入(ASI)机制的使用技巧和注意事项,需要的朋友参考一下 前言 相信从事过C#和Java的大家都知道分号是用作断句(EOS,end of statement)的,而且必须加分号,否则编译就不通过了。但JavaScript由于存在ASI机制,因此允许我们省略分号。ASI机制不是说在解析过程中

  • 问题内容: 好吧,首先我应该问一下这是否与浏览器有关。 我已经读到,如果找到了无效的令牌,但是代码段在该无效令牌之前一直有效,如果在该令牌之前加了换行符,则在该令牌之前插入一个分号。 但是,引用由分号插入引起的错误的常见示例是: ..似乎不遵循此规则,因为_a是有效令牌。 另一方面,分解呼叫链可以按预期工作: 是否有人对规则有更深入的描述? 问题答案: 首先,您应该知道哪些语句受自动分号插入(为简

  • 我正在编写一个函数,它在成功(和失败)时返回一个serde\u json::值。之前在Rust中,我省略了分号以从函数返回数据,如下面的代码示例所示: 这是我不明白的部分:它无法编译。Rust的编译器告诉我“类型不匹配”,并且它,但找到了类型serde\u json::value::value。现在,我找到了一个可以编译的解决方案,如下所示: 通过添加return语句,编译器突然高兴起来,不再对此

  • 问题内容: 在SQL Server中,是否可以使用存储过程在插入一些值的表中返回标识列的值?例如,如果我们在表中插入数据,则使用存储过程: 表TBL 用户ID整数,身份,自动递增 名称varchar 用户名varchar 密码varchar 因此,如果我运行存储过程插入一些值,例如: 我该如何返回此插入将发生的值。我需要其他一些操作的UserID值,有人可以解决吗? 问题答案:

  • 问题内容: 我正在尝试在INSERT语句之后找回键值。示例:我有一个带有属性名称和ID的表。id是一个生成的值。 现在,我想在同一步骤中重新获得ID。这是怎么做的? 我们正在使用Microsoft SQL Server 2008。 问题答案: 无需单独的SELECT … 这也适用于非IDENTITY列(例如GUID)