2011-10-06 24 views
0

我有一種情況,我必須在Javascript中使用eval。是的,我知道這是邪惡的,但在這種情況下,它是必需的,因爲兩個必備條件:javascript eval內在限制?

  1. Javascript代碼很大。
  2. 它只能在少數情況下被評估(和下載),所以我不希望腳本總是被下載,而是按需下載。

有了這些必要條件,我寫了一個XMLHttpRequest來請求代碼(600 + K),並且我想要評估該代碼是否立即生效。正如我稍後會顯示的那樣,該腳本僅包含要插入兩個變量的數據。問題是評估這個JavaScript失敗總是出現語法錯誤。如果我把代碼逐字(沒有評估),代碼執行得很好。這是最簡單的例子。我有一個search.js文件是這樣的:

// search.js for functional mind. Generated statically 
// from the set of posts. 
posts = { 'postlist' : ['<a href="XXX">YYY</a>', 'other link...' ] }; 
posts_for_word = { 'word1' : [0,1], 'word2' : [Z,K] }; 

最後一個變量,posts_for_word包括包含這個詞的帖子的指標。

// global environment 
var posts = {}; // Initial value, empty 
var posts_for_word = {}; // same 

function() { 
var request = // create XMLHTTPREQUEST request 
var response = // obtain response (the javascript) 
eval(response); // <- syntax error 
// access posts or posts_for_word 
posts.postlist[ posts_for_word['word1'][0] ] 
.... 
} 

的問題:

  1. 當我評估與EVAL上面顯示的JavaScript,火狐告訴我,這是不好的形成在第一線的時候我評估是一個和Javascript裏面的eval問題就來了。
  2. 然後我刪除了評論。我認爲eval會評估它,如果它是一個正常的Javascript程序,但它似乎並不接受評論(爲什麼?)。
  3. 刪除評論後,代碼工作,但Firefox的JavaScript控制檯仍然告訴我,第一行(定義JSON第一個變量)中存在語法錯誤。爲什麼?
+0

當需要加載JavaScript的通常方式是插入一個新的腳本標籤到DOM中。有沒有理由爲什麼這不適合你的情況? – cobbal

+0

@cobbal,我先試了一下。我那時可能做錯了什麼。我會再試一次,但它不起作用(我插入了腳本,但在下一個javascript行中找不到變量)。無論如何,「eval」的問題仍然存在。 –

回答

4

你不應該使用AJAX和eval()使腳本出現在您的網站,而是創建一個<script>元素與鏈接到文件並將其追加到身體:

(function() { 
    var jsCode = document.createElement('script'); 
    jsCode.setAttribute('src', 'http://localhost/tests/doStuff.js'); 
    document.body.appendChild(jsCode); 
}()); 

(這段代碼實際上是直接從我的小書籤中取得的,並且它很好地實現了這個技巧。)

至於變量作用域,如果在內部文件中聲明它們爲var variable,它將覆蓋文件範圍併成爲全局變量。


但是,如果您需要一個腳本的同步加載,你將不得不(儘管它被認爲是不好的做法),使用同步AJAX調用。如何做到這一點已經寫在我面前,Dynamically loading JavaScript synchronously

+0

謝謝,Rikudo Sennin。我也試過這個選項。問題是這個腳本是異步檢索的*,並且緊跟在那個動態DOM操作之後的那行*沒有看到*這個新變量。看起來代碼很大,加載需要很長時間,而且Firefox總是異步執行此操作。結果是:該代碼後面的行沒有找到該變量。過了一段時間,我再試一次,變量*就是*。現在,即使我添加'jsCode.setAttribute('async','');',腳本也是異步加載的。 –

+0

看看這個問題:http://stackoverflow.com/questions/2879509/dynamically-loading-javascript-synchronously –

+0

現在,更有意義。讓我試試吧(並且感謝指針!) –