Javascript Eval внутренние ограничения? - PullRequest
0 голосов
/ 07 октября 2011

У меня есть ситуация, в которой я должен использовать eval в Javascript. Да, я знаю, что это зло, но в этом случае это необходимо, потому что два условия:

  1. Большой код Javascript.
  2. Его нужно оценивать (и загружать) только в нескольких ситуациях, поэтому я не хочу, чтобы скрипт загружался всегда, а по требованию.

С этими реквизитами я написал XMLHttpRequest для запроса кода (600 + K), и я хочу, чтобы этот код был выполнен немедленно. Как я покажу позже, скрипт содержит только данные для вставки в две переменные. Проблема состоит в том, что оценка этого javascript всегда терпит неудачу с синтаксической ошибкой. Если я поставлю код дословно (без eval), код выполняется нормально. Это минимальный пример. У меня есть 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 включает в себя индексы постов, содержащих это слово. Проблема возникает, когда я оцениваю этот Javascript внутри eval:

// 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. Когда я оцениваю javascript, показанный выше, с помощью eval, firefox сообщает мне, что он неправильно сформирован в первой строке.
  2. Затем я удалил комментарии. Я предполагал, что eval оценит его так, как если бы это была обычная программа Javascript, но, похоже, он не принимает комментарии (почему?).
  3. После удаления комментариев код работает , но консоль Javascript в Firefox все же сообщает мне, что в первой строке есть синтаксическая ошибка (определяющая первую переменную JSON). Почему?

1 Ответ

4 голосов
/ 07 октября 2011

Вы не должны использовать AJAX и eval() для создания сценария на вашем сайте, вместо этого создайте элемент <script> со ссылкой на файл и добавьте его в тело:

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

(Этот код на самом деле взят непосредственно из моего букмарклета, и он прекрасно справляется с задачей.)

Что касается области видимости переменной, если вы объявите их как var variable во внутреннем файле, она переопределит область файла и станет глобальной.


Однако, если вам требуется синхронная загрузка скрипта, вам придется (несмотря на то, что это считается плохой практикой) использовать синхронный вызов AJAX. Как это сделать уже было написано до меня, Динамически загружать JavaScript синхронно

...