假設我有表示爲一個字符串的函數表達式我如何在函數聲明字符串匹配「obj.foo」
"var someFunction = function (foo) { foo.bar = 'hello'; };"
我怎麼能識別所有有效的(在JS語法方面)爲foo引用.bar安全地在那個字符串中?
即避免像"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%。無論如何,我很好奇如何去做。原有的功能存在回退和易於定義。
出於好奇,你使用'eval()'的用例是什麼? – Bojangles 2012-04-15 22:40:46
正則表達式是不可能的。 JS比正則表達式可以處理的複雜程度更高。 – 2012-04-15 22:44:27
我想內聯一個在單個像素上運行的函數調用。基本上我正在編譯2D畫布的像素着色器函數。調用每個像素的函數的開銷很大(在我嘗試的一些實現上),所以我試圖內聯函數調用。 – 2012-04-15 22:45:57