Javascript eval in jquery

JavaScript eval()

If the argument is an expression, eval() evaluates the expression. If the argument is one or more JavaScript statements, eval() executes the statements.

Do NOT use eval()

Executing JavaScript from a string is an BIG security risk.

With eval(), malicious code can run inside your application without permission.

With eval(), third-party code can see the scope of your application, which can lead to possible attacks.

Syntax

Parameters

Parameter Description
string A JavaScript expression, variable, statement, or sequence of statements

Browser Support

eval() is an ECMAScript1 (ES1) feature.

ES1 (JavaScript 1997) is fully supported in all browsers:

Chrome Edge Firefox Safari Opera IE
Yes Yes Yes Yes Yes Yes

Источник

Eval: выполнение строки кода

Встроенная функция eval позволяет выполнять строку кода.

let code = 'alert("Привет")'; eval(code); // Привет

Строка кода может быть большой, содержать переводы строк, объявления функций, переменные и т.п.

Результатом eval будет результат выполнения последней инструкции.

let value = eval('1+1'); alert(value); // 2
let value = eval('let i = 0; ++i'); alert(value); // 1

Код в eval выполняется в текущем лексическом окружении, поэтому ему доступны внешние переменные:

Значения внешних переменных можно изменять:

let x = 5; eval("x = 10"); alert(x); // 10, значение изменено

В строгом режиме у eval имеется своё лексическое окружение. Поэтому функции и переменные, объявленные внутри eval , нельзя увидеть снаружи:

// напоминание: режим 'use strict' включён по умолчанию во всех исполняемых примерах eval("let x = 5; function f() <>"); alert(typeof x); // undefined (нет такой переменной) // функция f тоже невидима

Без use strict у eval не будет отдельного лексического окружения, поэтому x и f будут видны из внешнего кода.

Использование «eval»

В современной разработке на JavaScript eval используется весьма редко. Есть даже известное выражение – «eval is evil» («eval – это зло»).

Причина такого отношения достаточно проста: давным-давно JavaScript был не очень развитым языком, и многие вещи можно было сделать только с помощью eval . Но та эпоха закончилась более десяти лет назад.

Читайте также:  Php root dir path

На данный момент нет никаких причин, чтобы продолжать использовать eval . Если кто-то всё ещё делает это, то очень вероятно, что они легко смогут заменить eval более современными конструкциями или JavaScript-модулями.

Пожалуйста, имейте в виду, что код в eval способен получать доступ к внешним переменным, и это может иметь побочные эффекты.

Минификаторы кода (инструменты, используемые для сжатия JS-кода перед тем, как отправить его конечным пользователям) заменяют локальные переменные на другие с более короткими именами для оптимизации. Обычно это безопасная манипуляция, но не тогда, когда в коде используется eval , так как код из eval может изменять значения локальных переменных. Поэтому минификаторы не трогают имена переменных, которые могут быть доступны из eval . Это ухудшает степень сжатия кода.

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

Существует два пути, как гарантированно избежать подобных проблем.

Если код внутри eval не использует внешние переменные, то вызывайте его так – window.eval(. ) :

В этом случае код выполняется в глобальной области видимости:

Источник

eval()

Предупреждение: Выполнение кода JavaScript с текстовой строки — это невероятный риск для безопасности. Злоумышленнику слишком легко запустить какой угодно код, когда вы используете eval() . Смотрите Никогда не используйте eval()!, ниже.

Метод eval() выполняет JavaScript-код, представленный строкой.

Интерактивный пример

Синтаксис

Параметры

Строка, представленная 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, а не 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) // вернёт функцию 

Спецификации

Поддержка браузерами

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?

This page was last modified on 28 окт. 2022 г. by MDN contributors.

Your blueprint for a better internet.

MDN

Support

Our communities

Developers

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.

Источник

Оцените статью