eval
Функция eval обрабатывает строку кода JavaScript без ссылки на определённый объект.
eval(string)
Параметр string строка представляющая выражение JavaScript, оператор или последовательность операторов. Выражение может содержать переменные и свойства существующих объектов.
Аргументом функции eval является строка. Если строка является выражением, eval вычисляет это выражение. Если аргументом является один или более операторов JavaScript, eval выполняет эти операторы. Не вызывайте eval для вычисления арифметических выражений; JavaScript вычисляет арифметические выражения автоматически.
Если Вы конструируете арифметическое выражение как строку, Вы можете использовать eval для вычисления его позднее. Например, предположим, у Вас имеется переменная x. Вы можете отложить вычисление выражения, включающего x, присвоив строковое значение выражения, скажем, «3 * x + 2», переменной, а затем вызвать eval из более поздней точки Вашего скрипта.
Если аргументом для eval не является строка, eval возвращает аргумент без изменений. В следующем примере специфицирован String-конструктор, и eval возвращает String-объект, а не вычисляет строку.
eval(new String("2+2")) // возвращает String-объект, содержащий "2+2" eval("2+2") // возвращает 4
Вы не можете косвенно вызвать функцию eval по имени, отличному от eval; если Вы это сделаете, может появиться ошибка времени выполнения. Например, Вы не должны использовать следующий код:
var x = 2 var y = 4 var myEval = eval myEval("x + y")
Пример. В этом примере eval используется для вычисления строки str. Строка состоит из операторов JavaScript, которые открывают диалоговое окно Alert и присваивают переменной z значение 42, если x равен пяти, и присваивают 0 переменной z в ином случае. Когда выполняется второй оператор, eval вызывает выполнение вышеуказанных операторов, а также будет вычислять набор операторов и возвратит значение, присвоенной переменной z.
var str = "if (x == 5)else z = 0; " document.write("z is ", eval(str)
Пример. В этом примере функция setValue использует eval для присвоения значения переменной newValue текстовому полю textObject:
function setValue (textObject, newValue)
eval()
Предупреждение: Выполнение кода JavaScript с текстовой строки — это невероятный риск для безопасности. Злоумышленнику слишком легко запустить какой угодно код, когда вы используете eval() . Смотрите Никогда не используйте eval()!, ниже.
Метод eval() выполняет JavaScript-код, представленный строкой.
Интерактивный пример
Синтаксис
eval(string)
Параметры
Строка, представленная JavaScript выражением, оператором или последовательностью операторов. Выражение может содержать переменные и свойства существующих объектов.
Возвращаемое значение
Возвращает значение выполнения кода, переданного в функцию в виде строки. Если код не возвращает ничего — будет возвращено значение undefined .
Описание
eval() — функция глобального объекта.
Аргумент функции eval() — строка. eval() исполняет содержащееся в строке выражение, один или несколько операторов JavaScript. Не стоит вызывать eval() для определения значения арифметического выражения; JavaScript вычисляет их автоматически.
eval() можно использовать для вычисления значения арифметического выражения, записанного в строковом виде, на более поздней стадии исполнения. Предположим, существует переменная x . Можно отложить вычисление выражения, в котором содержится х , если присвоить переменной это выражение в виде строки (допустим, » 3 * x + 2 «), а затем вызвать eval() в более поздней точке кода.
Если аргумент, переданный eval() , не является строкой, eval() возвращает его неизменным. В следующем примере определён конструктор String , и eval() не вычисляет значение выражения, записанного в строковом виде, а возвращает объект типа String .
eval(new String("2 + 2")); // возвращает объект типа String, содержащий "2 + 2" eval("2 + 2"); // возвращает 4
Это ограничение легко обойти при помощи toString() .
var expression = new String("2 + 2"); eval(expression.toString());
Если вы используете eval косвенно, вызовом его через ссылку, а не просто eval , в ECMAScript 5 это работает в глобальной области видимости, а не в локальной; это значит, что eval будет вызван в глобальной области видимости, а код будет выполнен с отсутствием доступа к локальным переменным в пределах области видимости, где он был вызван.
function test() var x = 2, y = 4; console.log(eval("x + y")); // Прямой вызов, использует локальную области видимости, результат - 6 var geval = eval; console.log(geval("x + y")); // Непрямой вызов, использует глобальную область видимости, бросит ReferenceError, т.к. `x` - не определён >
Не используйте eval без необходимости!
eval() — опасная функция, которая выполняет код, проходящий со всеми привилегиями вызывателя. Если вы запускаете eval() со строкой, на которую могут влиять злоумышленники, то вы можете запустить вредоносный код на устройство пользователя с правами вашей веб-страницы/расширения. Наиболее важно, код третьей стороны может видеть область видимости, в которой был вызван eval() , что может может привести к атакам, похожим на Function .
Также eval() , как правило, медленнее альтернатив, так как вызывает интерпретатор JS, тогда как многие другие конструкции оптимизированы современными JS движками.
Есть безопасные (и быстрые!) альтернативы eval() для общих случаев использования.
Доступ к свойствам
Вам не следует использовать eval() , чтобы конвертировать имена свойств в свойства. Рассматривая следующий пример, где свойство объекта используемое для доступа неизвестно до выполнения кода. Это можно сделать с eval:
var obj = a: 20, b: 30 >; var propname = getPropName(); // возвращает "a" или "b" eval("var result = obj." + propname);
Однако, eval() здесь не нужен. По факту, использование здесь его удивляет. Вместо него используйте доступ к свойствам, который быстрее и безопаснее:
var obj = a: 20, b: 30 >; var propname = getPropName(); // возвращает "a" или "b" var result = obj[propname]; // obj[ "a" ] то же, что и obj.a
Используйте функции вместо исполнения фрагментов кода
У JavaScript функции первого класса, что значит, что вы можете передавать функции как аргументы, хранить их в переменных или свойствах объектов и так далее. Многие DOM API созданы с учётом этого, так что вы можете (и вам следует) писать:
// вместо setTimeout(" . ", 1000) : setTimeout(function() . >, 1000); // вместо elt.setAttribute("onclick", ". ") использовать: elt.addEventListener("click", function() . > , false);
Замыкания также полезны как способ создания функций с параметрами без конкатенации строк.
Разбор JSON (конвертирование строк в JavaScript объекты)
Если строка, переданная в eval() , содержит данные (к примеру, массив: «[1, 2, 3]» ), а не код, вам следует рассмотреть JSON, позволяющий строке использовать подмножество JavaScript синтаксиса для представления данных. Смотрите также: Загрузка JSON и JavaScript в расширениях.
Заметьте, что синтаксис JSON ограничен в сравнении с JavaScript синтаксисом, многие валидные JavaScript литералы не распарсятся в JSON. К примеру, лишние запятые в конце выражений не разрешены в JSON, а имена свойств (ключи) в объектах должны быть в двойных кавычках. Будьте уверены использовать сериализацию JSON для создания строк, которые потом будут разбираться как JSON.
Передавайте данные вместо кода
К примеру, расширение, созданное изменять содержимое веб-страниц, должно иметь правила, определённые в XPath (en-US) , а не JS коде.
Выполняйте код с ограниченными правами
Если выполнять код всё-таки необходимо, желательно это делать с уменьшенными привелегиями. Этот совет подходит, главным образом, к расширениям и XUL приложениям, которые могут использовать Components.utils.evalInSandbox.
Примеры
Использование eval
В следующем коде оба выражения содержат eval() , возвращающий 42. Первое определяется строкой » x + y + 1 «; второе — строкой » 42 «.
var x = 2; var y = 39; var z = "42"; eval("x + y + 1"); // возвращает 42 eval(z); // вернёт 42
Использование eval для исполнения строки, содержащей операторы JavaScript
Следующий пример использует eval() для получения значения выражения str . Эта строка состоит из JavaScript выражений, печатающих в консоль, и, если x равен пяти, призывающих z значение 42, или 0 в противном случае. Когда второе выражение будет исполнено, eval() будет считать выражения выполненными, а также это установит значение выражению переменной z и вернёт его.
var x = 5; var str = "if (x == 5)else z = 0; " ; console.log("z is ", eval(str));
Последнее выражение выполняется
eval() вернёт значение последнего выполняемого выражения
var str = "if ( a ) < 1+1; >else < 1+2; >"; var a = true; var b = eval(str); // вернёт 2 console.log("b is : " + b); a = false; b = eval(str); // вернёт 3 console.log("b is : " + b);
eval как строковое определение функции, включающее «(» и «)» как префикс и суффикс
var fctStr1 = "function a() <>"; var fctStr2 = "(function a() <>)"; var fct1 = eval(fctStr1); // вернёт undefined var fct2 = eval(fctStr2); // вернёт функцию
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-eval-x |
Поддержка браузерами
BCD tables only load in the browser
Gecko-специфичные замечания
- Исторически eval() имел второй необязательный аргумент, указывающий на то, в контексте какого объекта будет выполняться выражение. Этот аргумент не был стандартизован и был удалён из SpiderMonkey в Gecko 1.9.1 (Firefox 3.5). См. баг 442333.
Смотрите также
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 7 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
MDN
Support
- Product help
- Report an issue
Our communities
Developers
- Web Technologies
- Learn Web Development
- MDN Plus
- Hacks Blog
- Website Privacy Notice
- Cookies
- Legal
- Community Participation Guidelines
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2023 by individual mozilla.org contributors. Content available under a Creative Commons license.
eval()
Функция eval() выполняет код, переданный ей в виде строки. Код, переданный функции, выполняется в той области видимости, где была вызвана функция.
Вызвав функцию eval() в коде верхнего уровня, она будет оперировать глобальными переменными и функциями. Вызвав её в области видимости функции, она будет оперировать локальными переменными и функциями.
Если функции eval() передать значение, отличное от строки, она просто вернёт это значение.
Если для функции eval() создать псевдоним (присвоить её другой переменной), а затем в области видимости какой-нибудь функции попытаться вызвать функцию через псевдоним то, она будет работать в глобальной области видимости, а не в локальной. Это значит, что код будет выполнен с отсутствием доступа к локальным переменным и функциям.
Синтаксис
eval(str);
Аргументы
- str: Строка, представляющая собой JavaScript-код.
Возвращаемое значение
- Возвращает значение последнего выполненого выражения или инструкции либо значение undefined, если последнее выражение или инструкция не возвращают значения.
Пример
var code = "var x = 10; alert(x * 10);"; eval(code); var x = eval("2 + 2") alert(x); "use strict"; eval("var a = 5;"); alert( a ); // Ошибка. Переменная не определена
Копирование материалов с данного сайта возможно только с разрешения администрации сайта
и при указании прямой активной ссылки на источник.
2011 – 2023 © puzzleweb.ru | razumnikum.ru
Позволяет выполнить строку-выражение с кодом на Python
Функция eval() выполняет строку-выражение, переданную ей в качестве обязательного аргумента и возвращает результат выполнения этой строки.
Аргументами eval() являются строка-выражение expression , которую требуется исполнить и необязательные глобальные globals и локальные locals значения. Передаваемые в функцию глобальные переменные должны быть словарем dict . Передаваемые локальные переменные могут быть любым отображающим объектом.
Если глобальные переменные указаны, но словарь globals не содержит атрибута __builtins__ данные переданного словаря со значениями будут дополнены данными общего глобального пространства, перед разбором выражения. Таким образом, выражение будет иметь доступ ко всем встроенным модулям.
Если локальные locals переменные не указаны, то используется словарь глобального пространства.
Если оба словаря опущены, выражение выполняется с глобальными и локальными значениями в среде, где функция eval() вызывается. Обратите внимание, что eval() не имеет доступа к вложенным областям
Функция eval() также может быть использована для выполнения кода, который возвращает функция compile() . Если объект кода в compile() собран в режиме exec будет возвращено None .
Функции eval() можно передавать результаты функций globals() и locals() .
Если вам необходимо выполнить динамический код, записанный в строку, то обратитесь к документации по функции exec() .
Примеры выполнения строки-выражения с кодом функцией eval() .
>>> x = "print('Привет')" >>> eval(x) # Привет >>> y = 'print("5 + 10 =", (5+10))' >>> eval(y) # 5 + 10 = 15 >>> s=3 >>> eval('s==3') # True >>> eval('s + 1') # 4 >>> eval('s') # 3 >>> eval('str(s)+"test"') # '3test'
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Функция abs(), абсолютное значение числа
- Функция all(), все элементы True
- Функция any(), хотя бы один элемент True
- Функция ascii(), преобразует строку в ASCII
- Функция bin(), число в двоичную строку
- Класс bool(), логическое значение объекта
- Функция breakpoint(), отладчик кода
- Класс bytearray(), преобразует в массив байтов
- Класс bytes(), преобразует в строку байтов
- Функция callable(), проверяет можно ли вызвать объект
- Функция chr(), число в символ Юникода
- Класс classmethod, делает функцию методом класса
- Функция compile() компилирует блок кода Python
- Класс complex(), преобразует в комплексное число
- Функция delattr(), удаляет атрибут объекта
- Класс dict() создает словарь
- Функция dir(), все атрибуты объекта
- Функция divmod(), делит числа с остатком
- Функция enumerate(), счетчик элементов последовательности
- Функция eval(), выполняет строку-выражение с кодом
- Функция exec(), выполняет блок кода
- Функция filter(), фильтрует список по условию
- Класс float(), преобразует в вещественное число
- Функция format(), форматирует значение переменной
- Класс frozenset(), преобразует в неизменяемое множество
- Функция getattr(), значение атрибута по имени
- Функция globals(), переменные глобальной области
- Функция hasattr(), наличие атрибута объекта
- Функция hash(), хэш-значение объекта
- Функция help(), справка по любому объекту
- Функция hex(), число в шестнадцатеричную строку
- Функция id(), идентификатор объекта
- Функция input(), ввод данных с клавиатуры
- Класс int(), преобразует в тип int
- Функция isinstance(), принадлежность экземпляра к классу
- Функция issubclass(), проверяет наследование класса
- Функция iter(), создает итератор
- Функция len(), количество элементов объекта
- Класс list(), преобразовывает в список
- Функция locals(), переменные локальной области
- Функция map(), обработка последовательности без цикла
- Функция max(), максимальное значение элемента
- Класс memoryview(), ссылка на буфер обмена
- Функция min(), минимальное значение элемента
- Функция next(), следующий элемент итератора
- Класс object(), возвращает безликий объект
- Функция oct(), число в восьмеричную строку
- Функция open(), открывает файл на чтение/запись
- Функция ord(), число символа Unicode
- Функция pow(), возводит число в степень
- Функция print(), печатает объект
- Класс property(), метод класса как свойство
- Класс range(), генерирует арифметические последовательности
- Функция repr(), описание объекта
- Функция reversed(), разворачивает последовательность
- Функция round(), округляет число
- Класс set(), создает или преобразовывает в множество
- Функция setattr(), создает атрибут объекта
- Класс slice(), шаблон среза
- Функция sorted(), выполняет сортировку
- Декоратор staticmethod(), метод класса в статический метод
- Класс str(), преобразует объект в строку
- Функция sum(), сумма последовательности
- Функция super(), доступ к унаследованным методам
- Класс tuple(), создает или преобразует в кортеж
- Класс type(), возвращает тип объекта
- Функция vars(), словарь переменных объекта
- Функция zip(), объединить элементы в список кортежей
- Функция __import__(), находит и импортирует модуль
- Функция aiter(), создает асинхронный итератор
- Функция anext(), следующий элемент асинхронного итератора