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
}

最も近い代替手段は、non-strict モードでのラベル付き関数宣言です。

B.3.2 ラベル付き関数宣言

ECMAScript 2015 より前の仕様でLabelledStatementは、ステートメント ラベルとFunctionDeclaration. ただし、ラベル付きFunctionDeclarationは厳密ではないコードに対して許容される拡張機能であり、ブラウザーでホストされるほとんどの ECMAScript 実装がその拡張機能をサポートしていました。ECMAScript 2015 では、13.13.1 の文法生成にas のLabelledStatement使用が許可されていますが、それが発生した場合に構文エラーを生成するアーリー エラー ルールが含まれています。Web ブラウザーの互換性のために、下線付きのテキストが追加されてそのルールが変更されます。FunctionDeclarationLabelledItem

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 に答える