2

誰でもこの動作を説明できますか? わかりません...変数aは触れられていません。どこで役に立ちますか?

a === undefined // not touched -> on call variable a got exception (this behavior I understand)
/a/.test(function(){a}) // => true !!?

ありがとう

編集:

回答ありがとうございます。現在、サブ質問が 1 つあります。

http://ejohn.org/blog/simple-javascript-inheritance/#ig-sh-2

このコードで:

fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/

なぜ John がこれを使うのか?, 単純な代わりに

fnTest = /\b_super\b/ 

私が正しいことを理解した場合は/xyz/.test(function(){xyz;})、常に真になります。

/xyz/.test('function(){xyz;}')
4

3 に答える 3

2

あなたが持っている場所:

a === undefined // not touched -> on call variable a got exception

これは、 aの値がundefinedかどうかをテストしています。a が宣言されていて値が割り当てられていない場合 (この場合、その値の評価はundefinedを返します)、または undefined の値が割り当てられている場合は true を返します。aが宣言されていないか、初期化されていない場合、参照エラーがスローされます。

それ以外の場合はすべてfalseを返します。

の:

/a/.test(function(){a}) // => true !!?

式は、次のように新しい正規表現を作成する/a/正規表現初期化子 (またはリテラル) です。

new RegExp('a');

これは、文字列内の任意の場所にある "a" 文字に一致します。

次に、正規表現のテストメソッドが呼び出され、true または false が返されます。testへの引数は文字列であることを意図しているため、そうでない場合は文字列に型変換されます。これにより、関数を表す文字列が返されます (基本的には関数の実際のコード)。したがって、効果的に次のものが得られます。

var re = new RegExp('a');
var s = 'function(){a}';
re.test(s);

true を返します (文字列に「a」があるため)。

編集

あなたはこれに関連して尋ねていたようです:

var initializing = false,
          fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;

これは、関数オブジェクトを正規表現のtestメソッドでテストした結果に基づいて、関数オブジェクトのテストを作成することです。

テスト メソッドへの引数は文字列であると想定されているため、ECMA-262 によれば、そうでない場合は文字列に変換されます。引数がオブジェクトの場合、そのtoStringメソッドが呼び出され、通常は関数本体でコードを返す関数に対して呼び出されますが、すべての ECMAScript ホストで常にではありません。

たとえば、組み込み関数の多くは次のようなものを返します。

function pow() {
  [native code]
}

したがって、上記が行っていることは、「関数が関数本体を返す場合、以下をfnTestに割り当てます」と言っています。

new RegExp('\\b_super\\b');

(この形式の正規表現には二重のバックスラッシュが必要であることに注意してください) これは、"_super" という単語を含む文字列に一致します。

関数が関数本体を返さない場合は、fnTestを次のように設定します。

new RegExp('.*');

これは、0 個以上の文字を含む任意の文字列に一致します。

于 2013-11-05T01:09:30.803 に答える
0

これらの動作の理由は次のとおりです。

  • a === undefined、明らかに定義されていないため、変数が例外を取得したことを示しています。

  • /a/.test(funcion(){a})正規表現変数/a/作成するため、trueを返します。

  • 内部testfunction(){a}関数を作成しますが、呼び出されていないため、例外は発生しません。

しかし、返品の理由がわかりませんtrue。= =

于 2013-11-05T01:02:16.353 に答える