Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';在全局代码中使用带标签的语句有什么错?_Javascript_Jslint - Fatal编程技术网

Javascript 什么';在全局代码中使用带标签的语句有什么错?

Javascript 什么';在全局代码中使用带标签的语句有什么错?,javascript,jslint,Javascript,Jslint,我只是浏览了一下,注意到这段代码: // Is this a labeled statement? //... if (next_token.labeled !== true || funct === global_funct) { stop('unexpected_label_a', label); } //... 有趣的部分是funct===global\u funct比较。通过JSLint运行以下代码段会抛出一个“意外的标签”错误,因为标签语句位于全局执行上下文中(我知道,这是一

我只是浏览了一下,注意到这段代码:

// Is this a labeled statement?
//...
if (next_token.labeled !== true || funct === global_funct) {
    stop('unexpected_label_a', label);
} //...
有趣的部分是
funct===global\u funct
比较。通过JSLint运行以下代码段会抛出一个“意外的标签”错误,因为标签语句位于全局执行上下文中(我知道,这是一个愚蠢的示例..):

循环:
对于(变量i=0;i<10;i++){
如果(i==5){
断环;
}
}
如果将同一个代码段放在函数中,JSLint会非常满意,并且在遇到标签时不会抛出错误。使用将通过JSLint的代码。如果您想尝试,可以将代码粘贴到中


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

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

ES5规范中规定了以下内容:

生产标识符:语句通过添加 将标识符添加到语句的标签集,然后计算语句

在对LabelledStatement求值之前,所包含的语句被视为拥有空标签集,除非它是迭代语句或SwitchStatement,在这种情况下,它被视为拥有由单个元素组成的标签集,
empty

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

var label = "My Label";
label:
for (var x = 1; x < 10; x++) {
    break label;
}
var label=“我的标签”;
标签:
对于(变量x=1;x<10;x++){
打破标签;
}
由于每条语句都有自己的标签集,因此这也是有效的:

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;
}
标签:
对于(变量x=1;x<10;x++){
//在'break'语句的标签集中查找'label',然后在'for'语句中查找'label'
打破标签;
}
标签:
对于(变量y=5;y<15;y++){
//再次相同。将永远不会在封闭的`for`语句外查找标签
打破标签;
}
由于您可以标记任何语句(这是毫无意义的,但也是可能的),因此您可以标记已标记的语句:

another:
label:
for (var y = 5; y < 15; y++) {
    break label;
}
另一个:
标签:
对于(变量y=5;y<15;y++){
打破标签;
}
在这种情况下,规范规定如下:

如果LabelledStatement本身有一个非空的标签集,那么这些标签也会添加到语句的标签集中 评估它

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

最后,该规范还规定(增加了重点):

带标签的语句仅与带标签的
break
继续
语句ECMAScript没有
goto
语句


所以基于所有这些,我想不出一种可能的方式,让全局代码中的任何标签干扰其他全局代码。当然,您不太可能希望程序包含具有相同标识符的多个标签,JSLint已经通过抛出“label is ready defined”错误来防止这种情况。但我不认为它在全局执行上下文中处理带标签语句的方式有任何区别。

它看起来可疑地像是“Goto被认为有害”的变体。我真的希望现代javascript中不支持这一点:@RobertHarvey-确实支持,但为什么在全局代码中表现不同呢?在函数中,至少损坏仅限于功能内部。:)您会使用使用全局标签的库吗?两个图书馆怎么样?如果他们使用相同的标签呢?如果您升级了一个库,而它现在使用了您在自己的代码中使用的标签,该怎么办?这是非常可怕的东西!
another:
label:
for (var y = 5; y < 15; y++) {
    break label;
}