2014-12-03 65 views
0

我試圖使用JSXGraph來顯示用戶在文本字段中輸入的函數。javascript - eval SyntaxError:標識符在數字文字後立即啓動

這是我的代碼:

  var board = JXG.JSXGraph.initBoard('box', {boundingbox: [-10, 10, 10, -10], axis:true}); 
     eval("function f(x){ return "+field.value+";}"); 
     board.create('functiongraph',[function(x){ return f(x); }]); 

此代碼工作完全當用戶輸入是這樣的:2 * X 但是,當用戶輸入:2倍(不含*),這是行不通的,我得到: SyntaxError:標識符在eval()行上的數字文字後立即啓動

我在做什麼錯?

+1

'eval'評估Javascript,'2x'是無效的Javascript。你需要你自己的解析器。 – georg 2014-12-03 10:10:32

+0

我怎麼能這樣做?感謝您的幫助 – Hybrid 2014-12-03 10:16:31

+0

這不是非常複雜,但你必須學習一些東西。從這裏開始:http://en.wikipedia.org/wiki/Parsing#Computer_languages – georg 2014-12-03 10:24:46

回答

0

在您的示例中,您可以撥打eval()來創建一個新的JavaScript函數,隨後繪製該函數。當然,那麼你必須提供正確的JavaScript。

第一個簡單的增強將是將digit letter的所有組合替換爲digit*letter。例如,用和(1+2)x替換2x(1+2)*x替代。這可以使用以下正則表達式完成。

/** 
* Expand math expressions with suppressed multiplication dots. 
* Examples 
*  2x -> 2*x 
*  (2+3)(3+1) -> (2+3)*(3+1) 
* Attention with exponents: 
*  x^2x -> x^2*x 
*/ 
expandShortMath = function(expr) { 
    var re = /([\)0-9\.])\s*([\(a-zA-Z_])/g; 
    return expr.replace(re, '$1*$2'); 
}; 

在你的榜樣,你會使用這樣的:

eval("function f(x){ return " + expandShortMath(field.value) + ";}"); 
board.create('functiongraph',[function(x){ return f(x); }]); 

不過,爲了安全起見,最好是避免調用eval()。出於這個原因,JSXGraph爲數學腳本語言JessieCode提供了自己的解析器。只需簡單地給board.create('functiongraph')提供包含函數項的字符串即可使用該解析器。但是JessieCode也需要乘法星。再次,這可以通過呼叫expandShortMath()來解決。

var board = JXG.JSXGraph.initBoard('box', 
       {boundingbox: [-10, 10, 10, -10], axis:true}); 
board.create('functiongraph',[expandShortMath(field.value)]); 
0

表達式解析器math.js可能在這裏派上用場。你可以這樣做:

var f = math.eval('f(x) = 2x^3 - 5'); 
console.log(f(2)); // outputs 11 
相關問題