次のような簡単なラベル付きステートメントを作成するとします。
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
}
最も近い代替手段は、non-strict モードでのラベル付き関数宣言です。
B.3.2 ラベル付き関数宣言
ECMAScript 2015 より前の仕様で
LabelledStatement
は、ステートメント ラベルとFunctionDeclaration
. ただし、ラベル付きFunctionDeclaration
は厳密ではないコードに対して許容される拡張機能であり、ブラウザーでホストされるほとんどの ECMAScript 実装がその拡張機能をサポートしていました。ECMAScript 2015 では、13.13.1 の文法生成にas のLabelledStatement
使用が許可されていますが、それが発生した場合に構文エラーを生成するアーリー エラー ルールが含まれています。Web ブラウザーの互換性のために、下線付きのテキストが追加されてそのルールが変更されます。FunctionDeclaration
LabelledItem
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);
}
ただし、文字列操作と関数コンストラクターを介してアクセス可能にすることができます。
参考文献