Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
-13 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 359

Eval против JSON.parse

11.11.2025, 17:46. Показов 1549. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сразу скажу, использовал оба метода, переключился на JSON.parse пожалуй больше из соображений более быстрого написания кода на php (хотя и повлияла встреченная где-то фраза, что eval работает медленно).

Но сейчас решил разобраться из чисто теоретического интереса: почему плохо и плохо ли использование eval в таком применении:

В php формируется строка типа:
PHP
1
2
$st= 'let m_el = ["знач. 1","знач. 2","знач. 3", ...];
echo $st;
=>
js
JavaScript
1
eval.call(window, xmlHttp.responseText);
По-моему понятно, что передается строка через аякс - js ее получает из надежного источника, выполняется код и формируется в данном случае массив.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.11.2025, 17:46
Ответы с готовыми решениями:

Отловить ошибку в JSON.parse (переварить не JSON)
получаю ajax ответ от сервера, это строка json. Если на сервере скрипт падает, например по...

SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data
Всем привет, пытаюсь произвести запрос к обработчику c помощью AJAX, выдает ошибку при парсинге...

Проверка валидности разбора JSON (JSON.parse)
Пытаюсь разобрать некорректную json строку вот так: var response = JSON.parse(data); Как...

32
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
11.11.2025, 17:58
Цитата Сообщение от 755 Посмотреть сообщение
По-моему понятно, что передается строка через аякс - js ее получает из надежного источника, выполняется код и формируется в данном случае массив.
По коду непонятно что формируется массив, и в какую переменную кладется.. получается код размазывается.. Допустим вы где-то далее по коду увидели переменную m_el - откуда она взялась? Вы ее в коде не найдете.

В целом перемешивать бэк с фронтом плохая практика. Бэк отдает только данные, а что с ними делать - уже решает фронт, и тогда у фронта остается свобода действий

JavaScript
1
let m_el = JSON.parse(xmlHttp.responseText);
Вот так намного нагляднее. Сразу видно, получили данные - положили в переменную.
1
-13 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 359
11.11.2025, 18:22  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
По коду непонятно что формируется массив, и в какую переменную кладется.. получается код размазывается.. Допустим вы где-то далее по коду увидели переменную m_el - откуда она взялась?
Все понятно и по коду. Просто указал основную цепочку формирования m_el.

Если подробнее:
JavaScript
1
2
3
4
5
6
7
8
9
10
let m_el;
frm_mEl () ;   // форм-ние m_el
if (m_el.lenght > 0)
 . . .
 
 
function frm_mEl () {
// Обработка полученных данных через аякс
 eval.call(window, xmlHttp.responseText); 
}
Добавлено через 3 минуты
Основной вопрос, наверное, связан с безопасностью: может ли кто-то извне изменить xmlHttp.responseText на чужом компьютере, причем только в одном единственном конкретном месте ?

Добавлено через 2 минуты
Конечно и Ваш вариант sad67man, нагляден.
Но исходил из того: в php массивы надо закодировать, в js распарсить - выполняется две операции, а в моем варианте с eval только одна - выполняется сам код, который и формирует массив
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
11.11.2025, 18:39
Цитата Сообщение от 755 Посмотреть сообщение
выполняется сам код, который и формирует массив
Вы нагружаете php лишней ответственностью, вы должны отдавать данные, а не куски js.. Все остальное даже не хочется обсуждать.. такой код будет просто больно поддерживать.
2
 Аватар для voraa
1249 / 1159 / 178
Регистрация: 21.01.2024
Сообщений: 5,384
11.11.2025, 20:02
Неперешибаемое упрямство. И самое непонятное - а в чем смысл?
Вот хочу eval и буду! Назло ... себе.

Цитата Сообщение от 755 Посмотреть сообщение
Все понятно и по коду. Просто указал основную цепочку формирования m_el.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
let m_el;         // ТУТ ОПРЕДЕЛЯЕТСЯ  m_el;
frm_mEl () ;   // форм-ние m_el
if (m_el.lenght > 0)
 . . .
 
function frm_mEl () {
// Обработка полученных данных через аякс
// СТРОКА 'let m_el = ["знач. 1","знач. 2","знач. 3", ...];'
// ОПЯТЬ let m_el!  ЭТО ТОТ ЖЕ m_el ИЛИ ДРУГОЙ?
 eval.call(window, xmlHttp.responseText); 
}
Если все понятно, то объясняете нам непонятливым.
0
-13 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 359
11.11.2025, 21:03  [ТС]
Цитата Сообщение от voraa Посмотреть сообщение
Неперешибаемое упрямство. И самое непонятное - а в чем смысл?
Причем здесь упрямство? Ни спорю, ни доказываю - и даже не за eval (просто сейчас начал переделывать модули выпадающего списка , написанные давно и только для них массивы значений из справочников формировались через eval ) и стало интересно, точнее, подумал, м.б. стоит выяснить, действительно ли он плох и в моем случае? И даже, если окажется, что он безопасен, быстрей всего буду пользоваться обоими вариантами по настроению.
Основной аргумент против - безопасность. Знакомился, но вопрос для моего восприятия оказался сложным, поэтому отложил его на потом (возможно, причина в недостатке знаний, а не ...). Поэтому и интересно, могут ли злоумышленники на компьютере Пользователя во время его работы залезть в код и поменять значение результата xmlHttp.responseText ? Мне кажется это практически невозможным, а м.б. и просто невозможно? Но прав ли? Не знаю. Если да, то тогда получается, что в таком формате использования eval это уже не аргумент против.

Опять моя невнимательность - поторопился (извините) - надо было исправить в php. Конечно же в php формируется:
PHP
1
2
$st= 'm_el = ["знач. 1","знач. 2","знач. 3", ...];
echo $st;
JavaScript
1
2
3
4
5
6
7
8
let m_el;         // ТУТ ОПРЕДЕЛЯЕТСЯ  m_el;
frm_mEl () ;   // форм-ние m_el
 
function frm_mEl () {
// Обработка полученных данных через аякс
// xmlHttp.responseText= ' m_el = ["знач. 1","знач. 2","знач. 3", ...];'
 eval.call(window, xmlHttp.responseText); 
}
просто sad67man, как я понял, было непонятно с кодом и попытался его раскрыть поподробнее - думал, этого окажется достаточно.
0
 Аватар для voraa
1249 / 1159 / 178
Регистрация: 21.01.2024
Сообщений: 5,384
11.11.2025, 21:19
Цитата Сообщение от 755 Посмотреть сообщение
надо было исправить в php. Конечно же в php формируется:
Код js надо править в файлах js, а не в php.
Потом, ловя ошибку вы даже не увидите, что там у вас выполняется.
Цитата Сообщение от 755 Посмотреть сообщение
Поэтому и интересно, могут ли злоумышленники на компьютере Пользователя во время его работы залезть в код и поменять значение результата xmlHttp.responseText ?
Вы можете быть спокойны. На вас злоумышленники внимания не обратят и ломать не будут.

Просто непонятно. Вы спрашиваете что то. Вам люди, у которых опыта и знаний побольше, отвечают, как сделать лучше и правильнее. Но
Цитата Сообщение от 755 Посмотреть сообщение
быстрей всего буду пользоваться обоими вариантами по настроению.
Так зачем тогда спрашивать? Делайте все по настроению. Какое настроение, то и получится.
2
-13 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 359
11.11.2025, 21:49  [ТС]
Цитата Сообщение от voraa Посмотреть сообщение
быстрей всего буду пользоваться обоими вариантами по настроению.
Так зачем тогда спрашивать?
• Написал: буду пользоваться обоими (возможно), если eval безопасен. Пока же так ответа и нет.
Цитата Сообщение от voraa Посмотреть сообщение
Вы можете быть спокойны. На вас злоумышленники внимания не обратят и ломать не будут.
Поживем, увидим...
Цитата Сообщение от voraa Посмотреть сообщение
Код js надо править в файлах js, а не в php.
Потом, ловя ошибку вы даже не увидите, что там у вас выполняется.
Легко - речь о конкретном случае, когда знаешь, что на выходе.
Можно привести такой аргумент: m_el = JSON.parse() форм-ся в php, хотя данные для js. Не буду утрировать, что данные для js формируются в php. В моем же примере так же формируются данные для js в php, правильность которых (а соответственно и логику) легко проверю и в js, т.е. логика отладки примерно одинаковая.
0
 Аватар для sad67man
2603 / 1507 / 689
Регистрация: 23.08.2015
Сообщений: 3,823
12.11.2025, 02:41
Цитата Сообщение от 755 Посмотреть сообщение
Но исходил из того: в php массивы надо закодировать, в js распарсить - выполняется две операции, а в моем варианте с eval только одна - выполняется сам код, который и формирует массив
json_encode нужно же делать в обоих случаях. Иначе как вы формируете массив для js?
0
-13 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 359
12.11.2025, 08:22  [ТС]
Цитата Сообщение от sad67man Посмотреть сообщение
json_encode нужно же делать в обоих случаях. Иначе как вы формируете массив для js?
Ошибаетесь.
В php формируется динамически строка выполняемого кода типа $st= 'm_el = ["знач. 1","знач. 2","знач. 3"];,' после чего через аякс данная строка $st передается в js, в котором после выполнения кода в eval.call(window, xmlHttp.responseText); формируются элементы массива. И все, данные переданы и сформированы. Попробуйте, просто выполните в php 2 две эти строки, и увидите - никакой json_encode не нужен.
0
Супер-модератор
Эксперт JSЭксперт HTML/CSSЭксперт PHP
 Аватар для gogolik
3951 / 2060 / 829
Регистрация: 13.03.2010
Сообщений: 6,777
12.11.2025, 08:24
755, вы совет пришли спрашивать или убеждать всех в своей правоте? Если второе, то оно нам тут даром не надо, тем более, если вы делаете какую-то ахинею.
0
-13 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 359
12.11.2025, 08:42  [ТС]
Цитата Сообщение от gogolik Посмотреть сообщение
755, вы совет пришли спрашивать или убеждать всех в своей правоте?
gogolik, странно такое слышать, по-моему ни в одном из моих сообщений нет и намека на то, что кого-то убеждаю - после вопроса с моей стороны практически только ответы и то только потому, что считаю невежливым не ответить тем, кто тратит на меня свое время. И сейчас также отвечаю по этой же причине.
Да, задал вопрос и было бы и интересно услышать на него ответ.
Но вот ответа на вопрос так и не услышал, хотя он мог бы быть достаточно лаконичным: да / нет - почему, (например, нельзя - могут подменить данные).

Добавлено через 6 минут
Кстати, и применение eval для этих целей не мог сам придумать, а когда-то давно, когда только изучал способы передачи данных через аякс должен был увидеть данный вариант
0
Эксперт .NET
 Аватар для Usaga
14127 / 9347 / 1350
Регистрация: 21.01.2016
Сообщений: 35,125
12.11.2025, 08:57
Цитата Сообщение от 755 Посмотреть сообщение
Да, задал вопрос и было бы и интересно услышать на него ответ.
Ответ: использовать `eval` очень плохо для обмена данными.

Во-первых, для этого есть JSON (можно и другие форматы)
Во-вторых, бэк не должен завязываться на то, кто и как будет обрабатывать ответ. Это может делать и не браузер, а мобильный клиент на Java
В-третьих, какая такая неприодолимая сила тебя гонит творить всякую ахинею и игнорировать учебники по языку, где принятые практики расписаны и разжёваны?
1
-13 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 359
12.11.2025, 09:11  [ТС]
Спасибо, Usaga, за ответ.
И просто отвечая на вопрос:
Цитата Сообщение от Usaga Посмотреть сообщение
какая такая неприодолимая сила тебя гонит творить всякую ахинею и игнорировать учебники по языку
на учебники пока нет времени - хочется побыстрее закончить и запустить проект. Потому м.б. будет время и на литературу.

по п.2.
Цитата Сообщение от Usaga Посмотреть сообщение
Это может делать и не браузер, а мобильный клиент на Java
Возможно ошибаюсь. Но, как понимаю, пишу конкретно под браузер, под мобильную версию изменятся формы и соответственно технология.
0
 Аватар для voraa
1249 / 1159 / 178
Регистрация: 21.01.2024
Сообщений: 5,384
12.11.2025, 09:36
Цитата Сообщение от 755 Посмотреть сообщение
на учебники пока нет времени - хочется побыстрее закончить и запустить проект.
На изучение ПДД и вождение пока нет времени. Хочется на работу и на дачу на машине ездить.
1
Эксперт .NET
 Аватар для Usaga
14127 / 9347 / 1350
Регистрация: 21.01.2016
Сообщений: 35,125
12.11.2025, 09:56
Цитата Сообщение от 755 Посмотреть сообщение
на учебники пока нет времени - хочется побыстрее закончить и запустить проект.
"Хочется" и "так это работает" - разные вещи. И я тебе скажу - оно так не работает. Ты на выдумывание ахинеи и борьбу с ней потратишь больше времени. Вплоть до того, что до результата дело и не дойдёт.

Цитата Сообщение от 755 Посмотреть сообщение
Но, как понимаю, пишу конкретно под браузер, под мобильную версию изменятся формы и соответственно технология.
Так писать можно универсально, не завязываясь ни на что. И так и надо делать.
0
-13 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 359
12.11.2025, 10:04  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Так писать можно универсально, не завязываясь ни на что. И так и надо делать.
Это было бы хорошо, но думается не всегда возможно. Например, использую табличный формат, который под мобильную версию не подойдет. Поэтому уже универсально не получится: под мобильную версию нужно будет разработать другой, более оптимальный формат, а т.к. форма формируется на сервере, то и соответственно не получается универсально.
0
Эксперт .NET
 Аватар для Usaga
14127 / 9347 / 1350
Регистрация: 21.01.2016
Сообщений: 35,125
12.11.2025, 10:07
755, ты сам это только что придумал, да? Я тебе говорю факты, продиктованные опытом, не только моим, а ты придумываешь что-то чтобы просто поспорить?

Прекращай эту ерунду. Нормально делать возможно всегда. Если нет никакого желания перенимать опыт, учиться делать быстро и нормально, то да - не всегда возможно.
0
-13 / 2 / 0
Регистрация: 12.11.2020
Сообщений: 359
12.11.2025, 10:19  [ТС]
Благодарю, Usaga, лучше на этом закончить тему. Зря вообще ее создал - отнял чужое время да и свое чуть чуть жаль - потрачено без пользы.
0
Эксперт .NET
 Аватар для Usaga
14127 / 9347 / 1350
Регистрация: 21.01.2016
Сообщений: 35,125
12.11.2025, 10:28
Цитата Сообщение от 755 Посмотреть сообщение
потрачено без пользы.
Т.е. ты и ответ прямой не воспринял... Уже не в первый раз. Зачем тогда спрашивать?..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.11.2025, 10:28
Помогаю со студенческими работами здесь

Код 200 SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
Ребята подскажите плиз, пытаюсь добавить форму отправки сообщений на сайт. После отправки выдает...

Постоянная ошибка SyntaxError: JSON.parse: unterminated string at line 1 column 132829 of the JSON data
что бы не делал, нормально в консоле JSON не выводит, нужно раз 20 обновить только тогда выведет...

SyntaxError: JSON.parse: unexpected character at line 2 column 5 of the JSON data
Здравствуйте. у меня есть простая задачка, которую никак не получается решить. Есть 2 файла в...

Ошибка "json.parse unexpected character"
Реализую на сайте систему комментариев. Добавление комментариев в базу происходит путём передачи...

Не работает JSON.parse, ошибка Unexpected token o
подскажите пожалуйста почему может не работать: var obj=JSON.parse (<?=$Arrbankomat?>); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru