Javascript замыкания и контексты выполнения - проблемы с проверенным кодом - PullRequest
0 голосов
/ 29 июня 2011

Я думаю, что у меня проблема с замыканиями и контекстами выполнения, хотя я не совсем уверен.

Позвольте мне объяснить, что именно я пытаюсь сделать и почему я кодировал это так, как я:

1) Я создаю интерфейс на основе JavaScript, интерфейс содержит различные приложения (я называю их виджетами).

2) Все виджеты являются перемещаемыми / перетаскиваемыми / закрываемыми / изменяемыми размерами и т. Д. Я пытаюсь достичь чего-то вроде интерфейса рабочего стола, хотя надо сказать, что то, что у меня есть, гораздо меньше, чем веб-операционная система , Но это то, к чему я стремлюсь.

3) Поэтому мне нужен был способ для кода JS загрузить каждый из этих виджетов, не зная, какие виджеты существуют и / или что-либо еще о них. Я решил, что когда интерфейс загружается, он должен вызвать php-скрипт, чтобы узнать имена виджетов.

4) JS-код имеет имя каждого виджета, теперь он проходит по ним все, вызывая другой php-скрипт, этот php-скрипт возвращает код для загрузки этого конкретного виджета и html-код для его отображения. JS добавляет элементы на экран для отображения, а затем загружает код JS для виджета.

5) Это сложная часть, на самом деле загрузка кода для каждого виджета, я сделал это так:

var func=new Function(ajax.responseText);
func();

И работает нормально, или, по крайней мере, похоже.

6) Теперь у меня проблема с объектами и массивами, и я думаю, что это как-то связано с контекстами выполнения.

Пример массива:

var myArray=new Array('foo', 'bar', 'fooBar', 'barFoo');

Выглядит нормально для меня, никаких проблем с реальным массивом (если я не напечатал там что-то не так :), не может работать без моего редактора Net Beans) Я попытался запустить его как отдельный скрипт, и он работает нормально, т.е. с: alert(myArray[0]); в результате foo

Проблема с массивом:

Мой JS-код не может сделать что-либо полезное с этим массивом, потому что фактический вызов alert(myArray[0]); приведет к foo, bar, fooBar, barFoo .. Не знаю, почему это происходит на самом деле, но сейчас все портится.

Пример объекта:

var myObject=new Object();
myObject.a='foo';
myObject.b='bar';
myObject.c='fooBar';
myObject.d='barFoo';

Опять же, объект работает нормально, когда запускается сам.

Объектная проблема:

Очень похожая проблема, что и с массивами, вызов alert(myObject['a']); на самом деле приведет к [object Object],[object Object],[object Object], [object Object] ...

... так что это та же проблема, что и с массивами, но с объектами становится еще хуже, если я вызову alert(myObject.a); (заметьте, что я не использовал ['a'] на этот раз), это просто приведет к undefined.

Итак, вернемся немного назад и объясним, как все связано друг с другом:

1) при загрузке JS он вызывает скрипт php, который возвращает закодированный в JSON объект, содержащий 3 ключа ('functions', 'JSscript', 'Other'). Каждый ключ содержит исходный код другого файла javacript. Все они загружаются с использованием динамически создаваемой функции, например: var func=new Function(ajax.responseText).

2) Тогда эти новые javascript-коды вызывают другой php-скрипт для дальнейших указаний.

3) Php отвечает JSON, который оценивается внутри динамически созданной функции и сохраняется в новой переменной.

4) Новая переменная теперь является объектом, содержащим, возможно, 3 ключа. (html, javascript, anotherObject) HTML-код добавляется в документ. JavaScript выполняется в новой функции, как указано выше.

5) Проблемы возникают с объектами / массивами, которые существуют в JS, выполненном в моем последнем утверждении.

Так что, если кто-нибудь может помочь мне в этом, я был бы рад, и если вам нужны дополнительные объяснения или примеры кода, то, очевидно, я буду рад предоставить.

Спасибо

Richard

Ответы [ 2 ]

0 голосов
/ 30 июня 2011

Оооо ... Оказывается, это не имеет ничего общего с замыканиями или любым другим javascript-кодом, извините, что вас всех это волнует.

Это было вызвано php-скриптом, а не даже php-скриптобрабатывает запросы AJAX, на самом деле это был скрипт, который читает файлы JavaScript, а затем JSON их.Этот скрипт также имеет функцию поиска и замены, например, простую систему шаблонов, где он находит все слова между '[' & ']', что, к сожалению, означает, что любые массивы в javascript будут запутываться.

Я использовалнайти и заменить квадратными скобками, потому что изначально он был предназначен для HTML-шаблонов, я просто не учел это должным образом, когда начал использовать систему в своем коде JS.

Итак, чтобы уточнить, мой скрипт phpизмените JS на obj[var].description на obj.description, что является действительным JS, поэтому я не заметил ошибок, чтобы я это заметил.

Оооооо.Какой неудачник:)

0 голосов
/ 29 июня 2011

Может быть, вы не анализируете текст ответа ajax.

...