标记语句 - 定义不正确?



对于JavaScript的label语法,JS MDN指出:

labelstatement

label:任何不是保留字的 JavaScript 标识符。

statement:一个 JavaScript 语句。

break可以与任何标记语句一起使用,continue可以与循环标记语句一起使用。

据此,您可以按如下方式中断:

statement: {
console.log("this will log");
break statement;
console.log("this will not log");
}

而且,由于它说您可以破坏任何标记的语句,因此我希望这会起作用:

function func() {
console.log("works?")
break statement;
console.log("this too?")
}
statement: {
console.log("this will log");
func();
console.log("this will not log");
}
// throws Uncaught SyntaxError: Undefined label 'statement'

但它抛出了Uncaught SyntaxError: Undefined label 'statement'

我想也许我可以按如下方式更新func

function func(breakMe) {
console.log("works?")
break breakMe;
console.log("this too?")
}
statement: {
console.log("this will log");
func(statement);
console.log("this will not log");
}
// throwsUncaught SyntaxError: Undefined label 'statement'

但是statement不能以这种方式引用(抛出statement is not defined);

同样的错误在这里:

statement: {
function func() {
console.log("works?")
break statement;
console.log("this too?")
}
console.log("this will log");
func();
console.log("this will not log");
}

我似乎对这个"任何"到底指的是什么有一个根本性的误解。

鉴于这有效:

labelOne: {
console.log("this will log")
labelTwo: {
console.log("will log too");
break labelOne;
console.log("this won't log");
}
console.log("neither will this");
}

也许更准确的描述是:

break只能在这些语句的上下文中与标记语句一起使用。

但即便如此,有了这个描述,func()应该破坏标记为statement的语句的执行,因为它与我的 POV 处于相同的上下文中。

那么语法定义不正确/不完整还是我错过了什么?

break必须嵌套在label内。完全有可能从标记上下文之外调用func,因此break不会引用任何内容。breakcontinue引用循环也是如此,它们必须字面上位于循环语句中。

换句话说,函数必须是独立的可执行代码段。您必须能够查看一个函数并能够知道它的作用。break该函数显然不属于任何循环或标签,在那里是荒谬的。该含义不能仅在调用时可用,还必须在声明时可用。

最新更新