0

如果我创建一个简单的标记语句,例如:

foo: do { alert('hi') } while (false)

有没有办法克隆 foo?

4

1 回答 1

0

不,显然这是不可能的。标签不能在赋值语句中使用,标签的范围是定义它的循环的条件块。

pastureLoop:
for (i = 0; i < pastureLen; i++)
{
   var pasture = pastures[i];
   var cows = pasture.getCows();

   var j, numCows = cows.length;
   for (j = 0; j < numCows; j++)
   {
      var cow = cows[j];
      if (cow.isSick())
         { break pastureLoop; }

      healthyCows++;
   }
}


pastureLoop:
for (i = 0; i < pastureLen; i++)
{
   var pasture = pastures[i];
   var cows = pasture.getCows();

   var j, numCows = cows.length;
   for (j = 0; j < numCows; j++)
   {
      var cow = cows[j];
      if (cow.isEating())
         { continue pastureLoop; }
   }

   // No cows were eating, so fire the callback for pasture[i]
   pasture.executeCallback();    // or whatever
}

最接近的替代方案是非严格模式下的标记函数声明:

B.3.2 标记函数声明

在 ECMAScript 2015 之前,规范LabelledStatement不允许将语句标签与FunctionDeclaration. 但是,标签FunctionDeclaration是非严格代码的允许扩展,并且大多数浏览器托管的 ECMAScript 实现都支持该扩展。在 ECMAScript 2015 中,LabelledStatement允许使用FunctionDeclarationas aLabelledItem但 13.13.1 的语法产生式包含一个早期错误规则,如果发生这种情况会产生一个语法错误。为了 Web 浏览器的兼容性,该规则通过添加下划线文本进行修改:

LabelledItem : 函数声明

It is a Syntax Error if any strict mode source code matches this rule.

这可用于创建不可访问的声明:

function show_alert()
  {
  label:
    {
    break label;
    var foo = 1;
    }
  console.log(foo);
  }

但可以通过字符串操作和函数构造函数访问。

参考

于 2012-05-21T23:36:16.463 回答