有没有办法访问JavaScript / ActionScript中的当前标签集

时间:2012-04-27 00:22:20

标签: javascript actionscript namespaces clone labeled-statements

如果我创建一个简单的labeled statement,例如:

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

有没有办法克隆foo?

1 个答案:

答案 0 :(得分: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的语法产生允许使用FunctionDeclaration作为LabelledItem,但13.13.1包含早期错误规则,如果发生这种情况则会产生语法错误。对于Web浏览器兼容性,通过添加带下划线的文本修改该规则:

     

LabelledItem:FunctionDeclaration

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);
  }

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

<强>参考