2015-04-23 45 views
0

我試圖使用eval()來evalute一個數學字符串變量和函數是否可以提供一個自定義範圍添加刪除瓦爾到eval函數?

例如:algo = "1+len+customfunction(6)"

所以,我對於len和數據customFunction功能。

它們顯然是在不同的範圍內聲明的。

我的東西試過像

process = function(vars, algo) { 
return (function() { 
    algo = algo.toLowerCase(); 
    return eval(algo); 
    }).call(vars); 
}; 

我需要提供所需的函數和變量EVAL。項目在不同的範圍內,我該怎麼做?

現在我有點迷茫和困惑,這是甚至可能嗎? 我認爲使用eval('var'+vName+'='+value)可以用於增值業務,但不適合功能。

EDIT:順便說一句EVAL可與(新功能(ALGO))() http://moduscreate.com/javascript-performance-tips-tricks/

+1

JavaScript區分大小寫。您可能不希望將使用'eval'執行的代碼轉換爲小寫。 –

+0

是的,但我的輸入不區分大小寫。我想要這種行爲 – Kwaadpepper

+0

好吧,我的壞,我會更正的例子 – Kwaadpepper

回答

0

我會移動至所需的數據的一個對象,其保存所有必需的項取代。任何給定的字符串都可以訪問。這種解決方案並不需要在這裏eval()

var data = { 
    customfunction: function (x) { 
     return Math.PI * x * x; 
    }, 
    len: 5 
}; 
var variable = 'len'; 
if (data[variable]) { 
    // do something 
    ; 
} 
var fn = 'customFunction'; 
function evaluate(vars, algo) { 
    if (data[algo.toLowerCase()]) { // 
     return data[algo.toLowerCase()].call(vars); 
    } else { 
     // fallback 
    } 
} 
var process = evaluate(vars, algo); 
+0

對不起,我剛剛明白了爲什麼我的問題不夠清楚,算法包含用戶數學公式,它可以通過應用程序函數和變量進行評估 – Kwaadpepper

+0

請爲'len'提供一個示例,並且'customfunction'。 –

+0

len = 5; customfunction = function(a,b){return a + b}; ('2 + 4 + len + customfunction(6 + 6)'); 應該打印18,但eval不知道len和自定義函數,因爲它的上下文是窗口 – Kwaadpepper

0

OK就是我發現:

  • 我們不能EVAL提供上下文
  • 的eval( '1 + 1')可以是((新函數('1 + 1'))(),它的方式更快
  • eval有不同的作用域,不能使用eval('var a = 1'); eval('alert(a)' );

所以,我心中已經設法:

  • 創建一個字符串初始化所有瓦爾:瓦爾+ = '變種 '+鍵+'=' + JSON.stringify(值)+ ';'
  • 更換在運行時我的算法中的字符串函數與他們的完整路徑:

    var algo = 'f(x)+5*2', x = 5;

    window.object.functions.x = function(a) { return a*2; };

    所以在運行時我x(與取代0 通過的eval執行的代碼最終是eval('object.functions.x(5)+5*2');和輸出當然是20 :)

看來工作。

相關問題