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 之前找到一个 { 或空格字符(空格、制表符等)。第二组在小[\s=]节后找到空格字符或等号。如果您发现还有其他可能性,您可以更改它。(?=...)匹配一个字符串,但不包括在匹配中。这意味着找到了空格字符或大括号或等号,但未包含在匹配中,因此不会替换 。

final/g表示找到所有匹配项。如果你知道只有一个,你可以省略它。

于 2012-04-15T22:55:31.140 回答