Pull to refresh

Comments 53

Зачем же столько eval в коде? Да ещё и глобальные переменные. Надо бы вам подучить матчасть. :)
По поводу обработки JSON, сама матчасть говорит о том, чтобы использовать eval(req.responseText).

По поводу функции this.method[index]=eval('...') тут увы ничего не поделаешь. Так как принимаются параметры со стороны, то фокусы типа function(met){...}(method[index]) не пройдут.

А к чему вопрос. Вы беспокоитесь за безопастность вашего клиента? Боитесь, что не те данные с сервера прийдут? :)
Это какая матчасть так говорит? Создатель JSON так не говорит к примеру. Поподробнее про фокусы и почему они не пройдут? Я, честно говоря, не понял.
Тот же создатель JSON говорит, что использование eval — это плохой стиль программирования. Всегда есть возможность обойтись без него.
Как результат, в этой самой строке с eval у вас ошибка на сайте и я вижу только чёрный экран. «Вот тебе и первая выгода…»
Спасибо, поправил. Не пользуйтесь IE :).
eval стал теперь больше - зато теперь нормально работает.
Я пользуюсь там eval, чтобы сгенерить функцию.
Как я уже говорил, штуки типа that[q]=function(a){...}(b) не пройдут, потому что в этой функции идёт работа с параметрами. Других выходов, как значение b (в примере method[index]) сделать там константным и разнообразным для различных q (в примере method[index]), я не представляю. Если у вас есть идеи - выслушаю.
Я уверен, что эту проблему можно решить. Я просто не могу её понять. Напишите упрощённый test case.
Что если написать так:
that[methods[index]] = (function (name) {
return function () {
request.push('"' + name + '":' + that.methods(arguments));
if (!timer) { /* ... */ }
};
})(methods[index]);


Ещё, в вашем примере вы забыли оператор new вот здесь: var File=PHPUIclass('FileManager.php');
А вот за это большое спасибо :)

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

Добавил new :)
в BASIC`е отучивали использовать GOTO
в JavaScript отучиваем использовать eval()

:o)
Улыбнуло :)
Нет, они правы. Действительно важный момент был реализован через жопу! Сейчас я уже поправил код. :)
Именно!

Абсолютно согласен с утверждением не использовать eval() в JS вообще, также как и GOTO в BASIC`е.

По крайней мере, при написании кода, на который приятно смотреть :)

Исключение — случаи, когда нужно что-то «быстро, кратко, на коленке», да и то, если написанный пример будет использоваться дальше, его стоит переписать с использованием замыканий и т.д.

Хотя.. Даже мыслить нужно так, чтобы изначально получался правильный код.
А не просто работающий.
Всё обсуждение проекта осталось на уровне - использовать eval или нет :)

Наверное мне стоит задуматься над тем, чтобы писать статьи по другому.
Термин "замыкания" вам о чем нибудь говорит?

function makeMethod(method){
return function(){
request.push('"' + method + '":' + that.methods(Array.prototype.slice.call(arguments)));
if (!timer)
...
}
}
this.add = function(res){
var methods = eval('{' + res.responseText + '}');
for (var index in methods)
that[methods[index]] = makeMethod(methods[index]);
}
Да, говорит. Спасибо, уже код привёл в порядок. Просто я сначала не понял, как это лучше всего реализовать. За что извиняюсь, конечно, как автор статьи.
Да, и вместо that.methods(Array.prototype.slice.call(arguments))) я бы использовал that.methods.call(null, arguments).
Я вам даже скажу почему. Потому что не надо по массиву бегать при помощи for (i in arr) Используйте старый добрый for (var i = 0, ii = arr.length; i < ii; i++) Это убережёт вас от наступания на многие грабли.

Тогда можно просто написать that.methods(arguments);
Глобальная переменная? Вы возможно имеете ввиду global $UImethod?
Завтра с утра добавлю небольшой комментарий по этому поводу в текст, а пока, просто отвечу комментарием.

Функция __call в классе UserInterface из UI.php вызывает статические функции (подлинкованные с помощью add()). Да, красиво было-бы внутри их использовать не $UImethod, а $this - да и правильнее, но вот в PHP есть такая особенность функции call_user_func[_array], которая теряет $this даже при вызове статических методов из других объектов. Правильнее, если мы хотим, чтобы $this не потерялся, вызывать функцию eval("$class::$func(...)"); вместо call_user_func(array($class,$func)) но тут вам снова не понравится использования eval'a ;)

Так что приходится выбирать между eval и гибкостью. Для данного примера я выбрал call_user_func для большей ясности.
Я не про РНР, я про JavaScript.
Вот это:
this.ajax_run=function(req){
eval('var ret='+req.responseText);
for (var i in func){
if (func[i])
func[i](ret);
}
request=[];
func=[];
timer=false;
}

Зачем там eval? И разве request, func и timer не глобальные переменные?
А Вы, как я понял, предлагаете парсить строку и в процессе создавать объект? В таком случае возрастет нагрузка со стороны клиента. При больших объемах принимаемых данных это не эффективно.
а почему бы не написать хотя бы
var ret = eval(req.responseText);
С этим согласен, но eval все равно остался.
Совместимость с IE - так оно не работает!
Да ну нах... проверил - работает.
А у меня нет - IE 7.0.5730.13 сразу в ошибку вылетает на этой строчке :)
http://zcn.ru/MVC/FileManager.php ['a','b','c','d'] итд.
Думаю, что {['a','b',...]} он воспринял-бы куда более достойно, но я не вижу особого смысла - всеравно через eval провожу.
ну JSON это как раз второй вариант
Знаю. В данном примере это что-то поправит?
IMHO - код будет много приятнее.
Я ошибся с просони. %)
Туда и так возвращается AJAX в виде {"dir":["a","b","c"...]} например. Какие предположения, почему выводит 'Expected ;' в IE при var ret=eval ?
ну как вариант, он должен возвращаться в формате {"dir":["a","b","c"...]};
тогда попробуйте ({"dir":["a","b","c"...]}) - вот такой вариант
({...}) cработало. В чём могла быть проблемма?
в том что было не так как сейчас. А я тоже не сразу понял в чём проблема
Ну ладно, поверим наслово, разберемся позже :)
eval выполняется учитывая контекст в котором его вызывают, видя локальные переменные и переменный в замыкании, лучше создававть через конструктор анонимную функцию. Она быстрее работает:
var ret = (new Function('return '+reg.responseText))();
Бля!!! вот это красота!!! решпект и уважуха!
Формально это тот же eval только написанный через другой синтаксис. Может оно и быстрее, но это те же яйца, только в профиль.
Это переменные класса PHPUIclass
А мне идея нравится. Может и не самая лучшая реализация, зато идея хорошая :)
Реализацию немного поправил в лучшую сторону. eval'ов осталось два :). Спасибо комментаторам.
"за привЕдение кода в порядок"
либо, после привидение скобку закройте :)
Спасибо за привИдение)
А насколько тормозит данное дело? Помоему данный подход будет очень нагружать систему.
Для клиента или для сервера?
Для сервера — это разгрузка — так как идёт снижение трафика и нет обработки типа Скинов.
Для клиента — это небольшая нагрузка. Один раз на страницу можно и поработать :)
1. Для клиента
2. Для сервера отдача файлов занимает мало время,
и экономия трафика, когда нет этого:
header(«Cache-Control: no-store, no-cache, must-revalidate»);
header(«Cache-Control: post-check=0, pre-check=0», false);
header(«Expires: Mon, 26 Jul 1997 05:00:00 GMT»);

3. А я уверен что будет. Правда на ваших примерах этого не заметиш, но на вещах побольше уже будет заметнее.
И как вы собираетесь например табличку нарисовать )

Смысл в темплейтах на яваскрипте, если рисуем один раз, грузим и не сохраняем в кеше.

Файл mod.fileview.php
@iconv — Данная фича приводит к тормозам, в данном случае это правда неважно.

$file=@iconv(«Windows-1251», «UTF-8», $file); А почему сразу не в UTF-8 делать файлы?

Вместо preg_replace можно использовать strtr
Начну с конца :)

Таблица рисуется JSом.

for…
skins.skin['GOODS_NAME']=…
skins.skin['GOODS_COUNT']=…
skins.skin['SKIN.TABLE']+=skins.use('%SKIN.TABLE.PIECE%');

Смысл темплейтов:
1) Ненужно подгружать их каждый раз. (если пользователь не жмёт F5). 2) Общаться с темплейтами в JS удобнее, чем на php, когда пишешь многофункциональный JS интерфейс.
3) Нет необходимости для сложных вставок на страницу, пользоваться createElement. Кода получается в 4 раза меньше.

Значения header'ов уже выставляются программистом в зависимости от поставленных задач. Само-собою, названия товаров в магазине, можно и нужно кешировать. А вот в игре, например, перемещение кораблей уже не удасться показывать с помощью кеша.
Я не пытаюсь показать максимально оптимизированный код. iconf использован лишь для примера.
Sign up to leave a comment.

Articles