В JavaScript вы можете использовать функцию eval () для анализа кода JavaScript в строке и вернуть соответствующий результат выполнения кода:
Кода -копия выглядит следующим образом:
Console.log (eval ("42 * 2")); // 84
Eval () по сути является функцией глобального объекта JavaScript. Например, приведенный выше код эквивалентен:
Кода -копия выглядит следующим образом:
console.log (this.eval ("42 * 2")); // 84
Однако при использовании оператора eval () первый метод, упомянутый выше, обычно принимается, то есть игнорировать глобальный объект и напрямую использовать eval ().
Использование eval ()
По следующим двум причинам, если вам не нужно, вы должны попытаться избежать использования оператора eval () в вашем коде:
1. Логически говоря, строки должны использоваться для хранения контента и информации во время работы программы, а не для хранения конкретной логики расчета.
2. Поскольку параметр eval () является строкой, и он не может быть лексическим для части строки, интерпретатор JavaScript не может оптимизировать для оператора вызова eval ().
возвращаемое значение eval ()
Возвратное значение eval () следует следующим правилам:
1. Если параметр eval () не является строкой, eval () непосредственно вернет параметр.
2. Если параметр eval () является строкой, то eval () анализирует строку в код и выполняет ее и возвращает результат последней строки выполнения кода.
3. Если строка не может быть проанализирована в законном коде, eval () вынесет ошибку синтаксиса.
4. Если строка может быть проанализирована в юридический код, но во время выполнения этого кода сообщается об ошибке, то ошибка будет сообщена в операторе eval () и выбрана eval ().
Кода -копия выглядит следующим образом:
Console.log (eval ([1,2,3])); // [1, 2, 3]
console.log (typeof eval ([1,2,3])); // объект
console.log (eval ("42 */2")); // Синтаксиртор
Console.log (eval ("42 * 2; 22 * 3;")); // 66. Eval возвращает результат последнего выражения/оператора
console.log (eval ("null.tostring ()")); // typeerror, исключение в коде оценки будет распространяться вне eval ().
переменная среда
Eval () в JavaScript имеет важную функцию: код в строке параметра Eval () может получить доступ к переменным во внешнем коде, а также может выявлять вновь созданные переменные в коде строки параметров внешнему коду. То есть, если строка параметров eval () может быть юридически проанализирована, JS заменит аналишенный код на строку, где находится eval (), расположено:
Кода -копия выглядит следующим образом:
// переменная среда
var a = 108;
console.log (eval ("function double (x) {return x*2;} a = double (a)"));
Консоль.log (a); // 216
Console.log (Double (33)); // 66
Стоит отметить, что предпосылка для реализации вышеуказанной функции заключается в том, что код в строке параметра eval () может быть юридически проанализирован. В дополнение к правильному синтаксису кода, JS также требует, чтобы код в строке параметра eval () должен быть «самоорганизованным»: код должен иметь смысл только в терминах кода в строке параметра. Например, невозможно передать строку, такую как «return»; для функции eval ():
Кода -копия выглядит следующим образом:
функциональный тест () {
var s = "test";
eval («return s;»);
}
test (); // syntaxError: вернуть не в функции
Если вы используете функцию eval () непосредственно, переменные, доступные к коду в строке параметра eval (), являются теми переменными в функции, где расположено оператор Eval (), то есть переменная среда, используемая функцией eval (), представляет собой «локальная среда переменной». Если вы не используете функцию eval () напрямую, но используете новую переменную, которая также указывает на функцию eval (), то переменные, доступные кодом в соответствующей строке параметра, являются глобальными переменными, то есть среда переменной, используемая функцией eval (), является «Глобальная переменная среда»:
Кода -копия выглядит следующим образом:
// локальная переменная среда и глобальная переменная среда
var renamed = eval;
var x = "Origin", y = "Origin";
функция f () {
var x = "new";
eval ("x += 'изменил';");
возврат x;
}
функция g () {
var y = "new";
переименовано ("y += 'изменилось';");
вернуть Y;
}
console.log (f (), x); // newchanged происхождение
console.log (g (), y); // new OriginChanged
Тем не менее, стоит отметить, что поведение в IE6, 7 и 8 отличается. В IE6, 7 и 8, даже если функция eval () переименована, «локальная переменная среда» все еще используется.