如果我创建一个简单的标记语句,例如:
foo: do { alert('hi') } while (false)
有没有办法克隆 foo?
不,显然这是不可能的。标签不能在赋值语句中使用,标签的范围是定义它的循环的条件块。
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
as 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);
}
但可以通过字符串操作和函数构造函数访问。
参考