0

文字列として表される関数式があるとします

"var someFunction = function (foo) { foo.bar = 'hello'; };"

その文字列で foo.bar へのすべての有効な (js 構文に関して) 参照を安全に識別するにはどうすればよいですか?

"catfoo.barbar"つまり、これらの参照を別のものに置き換えたいようなインスタンスを回避します。

(そして、誰かが確かに尋ねるでしょう...はい、私はevalを使用しています。はい、私のユースケースでは理にかなっています)


私が本当に探している最も重要なことは、有効なオブジェクト名を一致させる方法です。オブジェクト名のすべての有効な文字のセットを一致させるにはどうすればよいですか? 彼らは何ですか?áéíóú のような文字は明らかに有効な文字であるため、より複雑です。[0-9a-zA-Z_]

私が実際にやりたいことを説明するために。オブジェクトにプロパティを注入する関数があります

function shader(src, dst, out) {
    out.a = (src.a + dst.a)/2;
}

これは、2D キャンバス上の各ピクセルに対して呼び出されます。私がやりたいのは、この関数をインライン化し、賢明な方法ですべてのドット演算子を削除することです。

...
var src = {}, dst = {}, out = {};
...

for (i = 0; i < len; i += 4) {
    shader(src, dst, out);
}

シェーダーをインライン化すると、

...
var src = {}, dst = {}, out = {};
...

for (i = 0; i < len; i += 4) {
   out.a = (src.a + dst.a)/2;
}

しかし、ドット演算子も削除したいと思います。パフォーマンスの向上がどうなるかは本当にわかりません。それは役に立たないマイクロ最適化かもしれません。関数をインライン化すると、少なくとも FF のパフォーマンスが 100% 向上します。とにかくそれをどうするかについて興味がありました。元の関数は、フォールバックと定義の容易さのために存在します。

4

2 に答える 2

1

これは、javascript で書かれた javascript パーサーです: https://github.com/douglascrockford/JSLint/blob/master/jslint.js

素敵な構文木が生成されます。幸運を。

于 2012-04-15T22:48:16.057 に答える
0

次の正規表現を使用できます。

  /(?=[{\s])foo.bar(?=[\s])/

次のように、string.replace を使用します。

  var replaced = original.replace(/(?=[{\s])foo.bar(?=[\s=])/g, "replacement");

角かっこ の間の最初のグループは[\s{]、単語 foo の前に { またはスペーシング文字 (スペース、タブなど) を見つけます。2 番目のグループ[\s=]は、バーの後にスペーシング文字または等号を見つけます。他の可能性がある場合は、変更できます。(?=...)文字列に一致しますが、一致には含めません。つまり、スペーシング文字、中かっこ、または等号は見つかったが、一致には含まれていないため、置換されません。

最後/gは、すべての一致が見つかったことを意味します。1つしかないことがわかっている場合は、省略できます。

于 2012-04-15T22:55:31.140 に答える