2009-01-29 52 views
1

我目前正在開發一個教程網站,用於教授Web開發的基礎知識(HTML,CSS和JavaScript,適用於初學者)。我希望有一個設置,可以深入介紹各種主題,然後提供一個基本的沙箱環境,用戶可以編寫代碼解決每個教程部分末尾提出的問題。例如,如果我在前面的教程中介紹了乘法,並且用戶剛剛完成了有關能夠返回值的函數的課程,我可能會要求他們提交一個返回兩個參數乘積的函數。這是否適合使用動態函數創建的情況?

這是不是完美實例中使用動態函數創建將被認爲是一個好主意?我們來看一個例子。

<script> 
function check() 
{ 
eval('var f = ' + document.getElementById('user_code').value); 
if (f(5, 10) == 50) 
{ 
// user properly wrote a function which 
// returned the product of its parameters 
} 
} 
</script> 

這是不是一個壞主意?如果是這樣,請解釋。

回答

1

這聽起來像是可以工作的。但是,您的環境中最大的挑戰可能是錯誤處理。學生肯定會做出種種錯誤:

  • 編譯時錯誤,將在eval()
  • 運行時錯誤被檢測到,當你調用函數
  • 檢測不到運行時的錯誤,將被檢測,例如作爲無限循環或堆棧溢出

更復雜的方法可能會將輸入的JavaScript解析爲解析樹表示,然後將其與預期的解析樹進行比較。如果不匹配,請指出可能出現的問題並讓學生再次嘗試。如果它匹配,那麼你可以eval()並調用函數,知道它會做你期望的。

在Javascript中實現一個JavaScript的詞法分析器和分析器將是具有挑戰性的,但肯定不是不可能的。

1

聽起來像你想要重拍Firebug甚至在IE8中新的開發工具。因此,我不得不說,從來沒有一個有用的案例。如果這個網站上市,更不用說腳本注入的可能性。

+0

沒有絲毫的幫助,隊友... – 2009-01-29 01:55:18

1

只要您在封閉環境中操作此功能,就應該可以工作。 Eval爲您提供代碼注入攻擊,所以我不會把它放在一個可公開訪問的網站上,但是如果它完全包含在您的教室內,您應該沒問題。

1

該代碼可以工作,但如果語法或其他方面出現錯誤,該怎麼辦?也許使用try塊來捕捉任何錯誤並將其顯示給用戶會有所幫助...

不知道這是否有幫助。

1

就你而言,我覺得這沒有什麼錯。或者,您可以通過使用new Function()來先運行代碼,然後運行它。理論上,這將分離「編譯」和執行的階段。然而eval將首先檢查代碼反正拋出錯誤:

var usercode = document.getElementById('user_code').value; 
try { 

    var f = new Function('a','b','return (' + usercode + ')(a,b);'); 
    if (f(5, 10)) { 
    // user properly wrote a function which 
    // returned the product of its parameters 
    } 
    else { 
    // user wrote code that ran but produced incorrect results 
    } 

} 
catch (ex) { 
    // user wrote something really bad 
} 

以這種方式與做事的問題是,拋出的異常可能是荒謬的。"foo;;=bar"將在括號中報告「丟失」錯誤,而eval將拋出propper語法錯誤。您可以通過(regexp)首先從用戶代碼抓取參數和正文,然後構建它。但是,這怎麼會比eval好?

我認爲你真正的問題將幫助用戶避免隱式全局變量的陷阱。你將如何幫助用戶避免編寫僅在第二次運行時才運行的代碼,因爲全球首次被設置?您是否每次運行都不需要實施乾淨的沙箱?我會看看jsbin.com,firebug和類似工具如何處理這些事情。

我的感覺是,你應該現在用eval現在,如果需要出現問題,可以在以後更改爲更精細的東西。

相關問題