【问题标题】:object literal in JavaScriptJavaScript 中的对象字面量
【发布时间】:2014-02-26 14:52:38
【问题描述】:

多年来我一直在使用 JavaScript,但我刚刚发现这不会导致语法错误:

http://jsfiddle.net/DerekL/V5wNu/

{
    var a = "Hello";
    alert("Hello world");
}
console.log(a);   //"Hello world"

虽然没有块作用域,但它仍然像{} 不存在一样工作。

我认为{} 是一个对象字面量,它在里面接受的只是:

{
    key: content
    get function(){ ... }
    set function(){ ... }
}

但 JavaScript 解释器似乎知道它们是脚本,它只是像往常一样执行它。

我知道JS中有一些关键字会被解释器忽略掉,比如

javascript:

如果你将它添加到代码行中:

var a = "Hello";
javascript: console.log(a);   //this will work

它仍然有效。

但是根据这个逻辑,如果{a: "b"} 有效,为什么a: "b" 无效?

【问题讨论】:

  • 虽然只有函数作用域,但这并不意味着没有块。他们只是不创建自己的范围。
  • JS 还没有块范围。它很可能 - 如果不确定 - 成为 ECMAScript 1.6 (Harmony) 的一部分:it introduces the let keyword
  • 即使这有效,也并不意味着它是有效的。将在每个验证器上抛出错误。

标签: javascript


【解决方案1】:
a: "b"

有效的。

当在block 而不是object initializer 中时,它只是一个label(可以在break 语句中使用)后跟一个无用的字符串文字。

注意:由于这里已经有 3 个错误答案,如果前面的代码使{...} 分隔一个块,以便需要表达式(请参阅http://www.2ality.com/2012/09/expressions-vs-statements.html

【讨论】:

    【解决方案2】:

    编辑:好的,这太快了。

    Object litterals 是一对花括号,其中包含 field:value(可以是 object litteral 本身)对的(可能为空)列表,由 ,s 分隔。

    但是,(语法上)有效的代码块也可以用相同的语法编写:

    function a () { l: x }}
    

    这里l 被认为是一个标签,x 是一个包含变量引用的语句。

    用法上的差异将纯粹是上下文相关的(因此我只是部分第一个答案)。

    如果你调用一个函数或初始化一个变量,相同的构造将被解释为一个垃圾对象

    a ( { l:x } )
    a = { l:x }
    

    【讨论】:

    • 但是……那是错误的!您可以有一个不以 = 符号开头的对象字面量。
    • console.log({}) 为例。
    • @dystroy 你说得对,这过于简单化了。我的意思是解释是上下文的。查看我的编辑。
    猜你喜欢
    • 2013-04-22
    • 1970-01-01
    • 2010-11-09
    • 2016-05-15
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 2012-10-15
    相关资源
    最近更新 更多