2012-06-28 30 views
6

Tôi có một biểu mẫu về cơ bản là một máy tính. bạn có thể gõ một phương trình vào và nó sẽ đánh giá nó. Tôi cũng có 2 trường nhớ (hộp văn bản có tên m1 và m2), nơi bạn có thể gõ thứ gì đó vào và nó sẽ giữ giá trị đó và khi bạn gõ biểu thức trong hộp đầu tiên, bạn có thể tham khảo m1 hoặc m2 trong phương trình của bạn và sẽ đánh giá bằng cách sử dụng các số bạn đã nhập trong các trường bộ nhớ.Cách kiểm tra xem tên eval có không được xác định

Vấn đề là nếu bạn cố gắng tham khảo m1 hoặc m2 trong phương trình của bạn và hộp văn bản trống, Bạn nhận được lỗi không xác định.

Tôi đã quay bánh xe hàng giờ để thử và đặt một số loại kiểm tra xem nếu phương trình được đánh giá là không xác định, chỉ hiển thị hộp bật lên. Tôi cần điều này trong javascript thô. bất kỳ trợ giúp nào được đánh giá cao.

function displayResult(thisElement) 
{ 
    thisElement.value = eval(thisElement.value); <!-- this line throws the error if you use m1 and no m1 is defined, m2 and no m2 is defined, etc --> 
    if(!(thisElement.value>0)) 
    { 
     thisElement.value=0; 
    } 
} 

function mem(v) 
{ 
    v.value = eval(v.value); 
    eval(v.name+"="+v.value); 
} 

<input id="calcFormula" name="calculate" size="40" /> 
<input type="submit" value="Calculate" onclick="displayResult(this.form.calculate);" /> 

<input name="m1" id="m1" size="12" onchange="mem(this);" value="0" /> 
<input name="m2" id="m2" size="12" onchange="mem(this);" value="0" /> 
+0

Without nhìn quá sâu vào câu hỏi, sẽ có vấn đề với việc kiểm tra để đảm bảo rằng m1.value và m2.value không được xác định trước khi cố gắng đánh giá? EDIT: Được rồi, tôi có thể thấy bây giờ tại sao điều đó sẽ không hoạt động. Tôi thừa nhận điều này phức tạp hơn nhiều so với lần đầu tiên xuất hiện. –

+0

Ah !!! Quá nhiều eval !! – Mageek

+0

Bạn thực sự nên sử dụng thư viện như Knockout.js. Đây chỉ là quá lộn xộn. –

Trả lời

7

tôi có thể nghĩ đến ba giải pháp:

  1. Bạn có thể làm cho giả định rằng trống m1/m2 có nghĩa là 0, vì vậy sẽ có giá trị không bao giờ xác định. Điều này thực sự đơn giản hóa mọi thứ.
  2. Bạn có thể sử dụng regexp để kiểm tra đầu tiên cho bất kỳ sự xuất hiện của m1 hoặc m2 trong phương trình và nếu nó tồn tại sau đó kiểm tra nếu không xác định.
  3. Nhưng phương pháp tốt nhất là sử dụng try...catch.

try/catch Ví dụ:

try { 
    eval('12+3+m1'); 
} catch (e) { 
    alert(e.message); 
} 
+0

Cảm ơn bạn đã chỉnh sửa RobB :) –

+0

Tôi không biết rằng js có chức năng try/catch. Làm việc như người ở. – Catfish

1

các evalfails bởi vì nó cần để tải dữ liệu từ các trường mẫu, nhưng m1 là không có phím truy cập cho một lĩnh vực hình thức, và m1 là không có biến toàn cầu. , do đó, nó không thành công. tạo 2 biến toàn cầu và cho phép các biểu mẫu m1 và m2 lưu trữ các giá trị của chúng trong đó khi thay đổi.

kịch bản ban đầu của bạn không thành công vì chức năng evals m1 và m2 của bạn, nhưng họ nhận được bị phá hủy khi hàm kết thúc bởi vì họ không phải là phạm vi toàn cầu

function displayResult(thisElement) { thisElement.value = eval(thisElement.value); <!-- this line throws the error if you use m1 and no m1 is defined, m2 and no m2 is defined, etc --> if(!(thisElement.value>0)) { thisElement.value=0; } } 
m1=0; 
m2=0; 

<input id="calcFormula" name="calculate" size="40" /> <input type="submit" value="Calculate" onclick="displayResult(this.form.calc ulate);" /> 

<input name="m1" id="m1" onchange="m1=this.value" size="12" value="0" /> <input name="m2" id="m2" size="12" onchange="m2=this.value;" value="0" /> 

Tại sao mã ban đầu bạn không thành công:

Step 1. M1 is stored in the form. 
step 2. Onchange event is fired 
step 3. Function mem(this) is called 
step 4. Entering scope of function mem 
step 5. Inserting this.name into string 
step 6. Inserting this.value into string 
Step 7. evalling string 
step 7.1 found code m1=1 
step 7.1.1 check window object for variable named m1 
step 7.1.1.1 failed. Create local variable for function mem called m1 
step 7.1.1.2 assign value 1 to scope variable m1 
step 7.1.1.3 exit eval 
step 7.1.1.4 exit function mem(this) 
step 7.1.1.5 check for scoped variables 
step 7.1.1.6 scoped variable found m1 
step 7.1.1.7 destroy scoped variable and free up memory 
step 7.1.2.2 passed. retrieve pointer to window object variable m1 
step 7.1.2.3 assign value 1 to window.m1 
step 7.1.2.4 exit eval 
step 7.1.2.5 exit function mem(this) 
step 7.1.2.6 check for scoped variables 
step 7.1.2.7 none found, resume other tasks. 
+0

Sai. Nó không phải là một vấn đề phạm vi ở tất cả. Đó là một vấn đề của eval() 'ing một tên mà không tồn tại. – Catfish

+0

nó là một vấn đề phạm vi. Khi evalling withing một fuction, mà không có globals, các biến evalled được scoped. Mã của anh ta evals các var tên hoàn hảo, nhưng chỉ trong phạm vi chức năng của mình – Tschallacka

+0

Sau đó, tại sao nó hoạt động nếu có giá trị trong m1 và m2? Tôi chỉ có vấn đề khi bạn không bao giờ nhập một giá trị trong m1 và m2. Đó là bởi vì họ không xác định. – Catfish

Các vấn đề liên quan