标签声明 - 定义错误?

时间:2018-05-16 11:52:59

标签: javascript

对于JavaScript的label语法,JS MDN states

  

label:      statement

     

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处于相同的上下文中。

语法是否错误/不完整定义或我遗漏了什么?

1 个答案:

答案 0 :(得分:2)

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

换句话说,函数必须是一个自包含的可执行代码段。您必须能够查看某个功能并能够分辨它的作用。该函数中的break显然不属于任何循环或标签,它在那里是荒谬的。这个含义不仅可以在通话时使用,而且必须在声明时提供。