5

私は Spencer Tipping の優れたJavascript in Ten Minutesを読み直しましたが、レイジースコープを使用して構文マクロを作成するこの例で何が起こっているのか、一生理解できません。

var f = function () {return $0 + $1};  
var g = eval (f.toString ().replace (/\$(\d+)/g,  
           function (_, digits) {return 'arguments[' + digits + ']'}));  
g(5,6); // => 11 (except on IE)

特に、

  1. $0 と $1 は関数定義に置き換えられています --その関数はどのように評価されますか? (おそらく eval() によるものですが、私はこれを見ていません)。
  2. 関数内の単一のアンダースコア引数の目的は何ですか? それを取り除くと、コードは機能しなくなります。おそらくそれは単なるプレースホルダーですが、なぜそれが必要なのですか?
4

2 に答える 2

5

ここでpstに同意します。このコードはかなり怖いです。読みやすさにとっては恐ろしいです。しかし、それはきちんとしています:

  1. f一種のプレースホルダー関数として定義されています。それは実際の マクロそのもののようです。数値変数は に評価されるときに置き換えられますg。これらは、以下で説明する位置の可変引数として機能します。
  2. gここで魔法が起こります: の関数定義はf文字列に変換され、マクロ定義の数値変数fは、 の定義にある数値変数と同じ数のインデックス付き引数への参照に置き換えられますf(したがって、正規表現と呼び出しへreplace)。のコールバックへの最初のパラメータを気にしないため、アンダースコアが使用されていますreplace
  3. 次に、全体がeval編集fされ、基本的に次のように展開されます。

    function () { return arguments[0] + arguments[1] }
    

したがって、必要なf数の位置数値引数で定義できるという点で、すっきりしています。

var f = function() { return $0 + $1 + $2 }

そしてそれは評価されます

function() { return arguments[0] + arguments[1] + arguments[2] }

きちんとしているが役に立たず、間違いなく危険で、非実用的で読みにくい。私はおそらくそれを使用することはありません。

于 2012-06-26T21:35:08.843 に答える
5

そのコードは私を怖がらせます。絶対に使ってはいけません。(そうするのに本当に説得力のある正当な理由がない限り、私は1 2を認識していません。) また、おそらくコールバックの使用を除いて、上記のコードで示されている「関数型プログラミング」はありません。しかし、クロージャーが含まれていないので、C でも簡単にそれを行うことができます。

_は単なる有効な識別子 (fooまたは_fooまたは など$0) です。これは「ドント ケア」に使用されます (関数は RegExp 一致の「コールバック」であるため、値は一致したテキスト全体の値です)。

$0とは、それぞれと$1に置き換えられます (これは、関数の "文字列" 値へのテキスト置換であることを思い出してください!)。「マクロ」なしで手動で入力できた可能性があります。arguments[0]arguments[1]

function () { return arguments[0] + arguments[1] }

または私がしたであろうこと:

function (a,b) { return a + b }

残り (Function.toStringおよびeval(functionStr)) は、依存する「マクロ」のものをサポートするのにナンセンスです: Function -> codeString -> alteredCodeString -> Function.

このコードには、「ソースをそのまま」出力できる作業が必要です。 Function.toStringIE がこれをサポートし始めた時期はわかりませんが、IE9 では動作するようです。


1これはちょっとしたうそですが、私がそのようなアプローチを使用した唯一の場所は、サイドバー ガジェットの IE で、フライアウトが取り消されたときに DOM が「早期にアンロード」される可能性があり、別の機能を呼び出そうとすると他の厄介な問題が発生する可能性がありました。window環境。めちゃくちゃな状況。。

2 Functional JavaScript Libraryは、 .NETなし でどれだけの「マクロ マジック」を実行できるかを示していますeval

于 2012-06-26T21:30:39.363 に答える