JavaScript 语法高亮——status 是关键字吗? -- 有什么用?

问题描述 投票:0回答:3

我的 vim 语法高亮让我相信

status
是 JavaScript 中的关键字。

搜索我能找到的所有内容都是关于浏览器 JavaScript 中的

window.status
的文章。这是这个“关键字”的含义吗
status
还是有什么不同的事情发生?

关键字是什么

status

javascript vim syntax-highlighting
3个回答
5
投票

这个答案实际上是不正确的。我可能混淆了

static
status
。 Mozilla 网站有一个关于
window.status
的页面。它可能已经这样做了,因此您不会尝试使用该名称作为变量。这样您就不会无意中更新浏览器的状态栏。该功能不再起作用,但我猜编辑器已经滞后了。


Mozilla 文档(比 ECMA 参考文献更容易阅读)中,我们在

未来保留关键字
部分下找到 status 关键字。

因此,它被视为关键字。

但是,JavaScript 在各个地方接受保留关键字,例如句点之后:

a = {}
a.default = 123
a.status = 555

这里我设置了对象

default
status
a
成员,尽管这两个名称在语言中被视为保留关键字。

实际上,如果您一直在使用 Promise 对象,您可能已经注意到

catch
关键字被用作可能的回调之一:

Promise.all([a, b, c])
       .then(...)
       .catch(...)     <-- this is a reserved keyword
       .finally(...)   <-- this is a reserved keyword

以下是相关语法条目:

Identifier :
    IdentifierName but not ReservedWord

MemberExpression :
    PrimaryExpression
    MemberExpression [ Expression ]
    MemberExpression . IdentifierName     <-- look at this one
    MemberExpression TemplateLiteral
    SuperProperty
    MetaProperty
    new MemberExpression Arguments

IdentifierName
是任何标识符(或多或少
[A-Z_$][A-Z_0-9$]*
,加上所有 Unicode 字符......它们实际上遵循标识符的 Unicode 定义。)其中包括保留关键字。

正如我们所看到的,您不应该以

ReserverWord
开始表达式,除了像
new
super
这样的新异常(此处未显示,请参阅
SuperProperty
。)

因此,在严格模式下(即在节点模块中),如果您编写以下内容,您应该会收到错误:

status = 123

在非严格模式下,

status
不是保留关键字,因此是允许的。

确保它在访问变量成员时有效的一种方法是使用数组语法。例如:

a['default'] = 123
a['status'] = 555

这样,名称就不会被编辑器突出显示为保留关键字。


2
投票

如果您在控制台上玩。您可以执行以下操作:

-> status
<- ""

-> window.status
<- ""

-> status='333'
<- "333"

-> status
<- "333"

-> window.status
<- "333"

这对我来说表明关键字

status
只是
window.status
属性的别名。我不确定
window.status
到底是什么。

编辑:阅读下面的评论后,我意识到 windows 对象的属性本质上是全局的。所以这使得 status 与 window.status 相同,而不是我上面提到的别名。

请参阅有关 window 对象的 Stack Overflow: Javascript 中的 window 真的是全局的吗?


0
投票

官方“状态”可以定义为关键字,也可以不定义;但当我尝试使用它作为标识符时,我遇到了麻烦。这是一个片段:

<html>
<body>
status IS a key word.
<br/>
<span id="stat1"></span></div>
<br/>
<span id="stat2"></span></div>
  <script>
    var status = document.getElementById("stat1");
    status.innerHTML = "foo";
    console.log(status.innerHTML);
    var xtatus = document.getElementById("stat2");
    xtatus.innerHTML = "bar";
    console.log(xtatus.innerHTML);
  </script>
</body>
</html>

在您同意更改名称之前,不会显示内容。控制台显示“未定义”而不是“foo”。

© www.soinside.com 2019 - 2024. All rights reserved.