7

最近、John Resig による inherit.jsという小さなユーティリティ ライブラリを使用しました。私は通常、使用しているライブラリのコア部分を理解しようとしますが、頭を悩ませた後、コードの難しい部分 (つまり、スーパークラスの対応するメソッドを呼び出す方法) を最終的に理解しました。

取得できない 1% ビットは、正規表現に関連しています

fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
  1. 正規表現 /xyz/ は関数に対してテストされます。文字列を引数として取るMSDNMDN状態の両方。test機能についての言及はありませんが、コンソールにエラーがないので、おそらく飛ぶに違いないと思いますが、どのように機能しますか?
  2. 次の WTF は、関数本体がxyz;. この関数は実行できません。そうしないと " ReferenceError: xyz is not defined" になるからです。右?それで、それは何をしますか?
  3. テストの結果が true の場合は、単語境界fnTestをチェックする正規表現に等しく_super、それ以外の場合は何にでも一致する正規表現になります。ダブルWTF; 繰り返しますが、どのように、なぜですか。

後で、この正規表現が使用されている関連するコードがあります。

  // Check if we're overwriting an existing function
  prototype[name] = typeof prop[name] == "function" &&
    typeof _super[name] == "function" && fnTest.test(prop[name])
        ? aFunctionThatCanCallSuper /* Lots of code */
        : prop[name];

ここで私が疑問に思っているのは、fnTest.test(prop[name]). プロパティが存在するかどうか、関数であるかどうかなどをチェックする他のすべてのテストは理解していますが、正規表現テストの機能は理解していません。誰?

4

1 に答える 1

6

The what:

test only takes strings as input, so a function will be toStringed, like will any other object that's not a string. xyz is not interpreted as a variable, but as a string, so it won't throw a reference error. This happens in other places as well, take this for example:

var a = function(){}; var b = function(){};
console.log(a + b); // `+` coerces with `toString`

The why:

The serialization of functions in old browsers is not reliable and might not output the _super property in the function's body, but (I'm assuming) something like function{[native code]} or [object Object]; in those cases use a regex such as /.*/ to match anything and not perform the optimizations that can be done in browsers that output the correct result.

Related links for more info:

http://blog.buymeasoda.com/understanding-john-resigs-simple-javascript-i/ (found by Andreas)
http://es5.github.io/x15.3.html#x15.3.4.2
http://bytes.com/topic/javascript/answers/747203-function-tostring

于 2013-06-21T06:15:48.567 に答える