gpt4 book ai didi

javascript - 在全局代码中使用带标签的语句有什么问题?

转载 作者:数据小太阳 更新时间:2023-10-29 04:18:32 26 4
gpt4 key购买 nike

我刚刚浏览了 source of JSLint并注意到这段代码:

// Is this a labeled statement?
//...
if (next_token.labeled !== true || funct === global_funct) {
stop('unexpected_label_a', label);
} //...

有趣的部分是 funct === global_funct 比较。通过 JSLint 运行以下代码片段会引发“意外标签”错误,因为标签语句位于全局执行上下文中(我知道,这是一个愚蠢的例子。Here's a fiddle .):

loop:
for (var i = 0; i < 10; i++) {
if (i === 5) {
break loop;
}
}

如果您将相同的片段放在函数中,JSLint 会非常满意,并且在遇到标签时不会抛出错误。 Here's a fiddle使用将通过 JSLint 的代码。代码可以粘贴到online version of JSLint如果你想尝试一下。

所以我的问题是:在全局代码中使用带标签的语句有什么问题吗?还是这只是 Crockford 的另一个个人选择?

最佳答案

在对标签语句的行为进行一些调查后,我认为这实际上只是 Crockford 的一个选择,没有任何事实依据。据我所知,没有任何情况会导致与全局范围内的标签发生命名冲突(这似乎是人们可以想到为什么 JSLint 不允许它的主要原因 - 请参阅问题的评论)。

ES5 规范在 section on labelled statements 中声明了以下内容:

The production Identifier : Statement is evaluated by adding Identifier to the label set of Statement and then evaluating Statement.

...

Prior to the evaluation of a LabelledStatement, the contained Statement is regarded as possessing an empty label set, unless it is an IterationStatement or a SwitchStatement, in which case it is regarded as possessing a label set consisting of the single element, empty.

我认为这意味着每个语句都有一个标签集。标签标识符独立于变量和函数标识符,因此在相同范围内具有与变量相同标识符的标签在语法上是可接受的。换句话说,这是有效的:

var label = "My Label";
label:
for (var x = 1; x < 10; x++) {
break label;
}

由于每个语句都有自己的标签集,这也是有效的:

label:
for (var x = 1; x < 10; x++) {
//Looks for 'label' in label set of `break` statement, then `for` statement
break label;
}
label:
for (var y = 5; y < 15; y++) {
//Same again. Will never look for label outside the enclosing `for` statement
break label;
}

既然你可以标记任何语句(这是没有意义的,但它是可能的),你可以标记一个带标签的语句:

another:
label:
for (var y = 5; y < 15; y++) {
break label;
}

在这种情况下,规范规定如下:

If the LabelledStatement itself has a non-empty label set, these labels are also added to the label set of Statement before evaluating it.

在上面的代码片段中,for 语句的标签集包含两个标签(anotherlabel)。可以从 for 语句中中断这些标签中的任一个

最后,规范还指出(强调):

Labelled statements are only used in conjunction with labelled break and continue statements. ECMAScript has no goto statement.

因此,基于所有这些,我想不出一种可能的方式让全局代码中的任何标签干扰其他全局代码。当然,您不太可能想要一个包含多个具有相同标识符的标签的程序,而 JSLint 已经通过抛出“标签已定义”错误来防止这种情况发生。但我认为它在全局执行上下文中处理标记语句的方式应该没有任何区别。

关于javascript - 在全局代码中使用带标签的语句有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11530485/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com