У меня есть переменная y = "x*x"
, что нужно сделать чтобы превратить это в исполняемый код. То есть при вызове f(y)
мне вместо f("x*x")
подставлялось f(x*x)
Воспользуйтесь функцией eval
:
f(eval(y));
Живой пример:
function f(number) {
console.log(number);
}
let x = 7;
let y = "x*x";
f(eval(y));
Однако не стоит использовать eval
без лишней необходимости, возможно стоит переписать код по другому.
Именно в таком виде вам подойдет ругаемый многими eval
(но только в том случае, когда вычисляемое вами выражение получено из доверенного источника!):
var x = 5;
var expr = "x*x";
console.log(eval(expr)); // 25
Но это - довольно опасная функция, поскольку она имеет доступ ко всем вашим локальным переменным и может, к примеру, перезаписать любую из них. Если не допускать ошибок, то это не страшно - но ошибки делают все. Поэтому можно воспользоваться одной из более ограниченных функций.
Второй вариант - new Function
, позволяет дать доступ только к глобальным переменным и явно указанному списку параметров, что защитит от сюрпризов, вызванных конфликтами имен:
var expr = "x*x";
var exprF = new Function("x", "return " + expr);
console.log(exprF(5)); // 25
Для того, чтобы "спрятать" глобальные переменные от случайного обращения к ним, можно использовать трюк со скрытым фреймом:
<iframe id="jscontext" href="about:blank" style="display:none"></iframe>
var jscontext = document.getElementById('jscontext').contentWindow;
var expr = "x*x";
var exprF = new window.Function("x", "return " + expr);
console.log(exprF(5)); // 25
Тем не менее, этот трюк не защищает вас ни от намеренного обращения к вашим глобальным переменным, ни от взаимодействия с вашими серверами от имени текущего пользователя (это называется XSS-атакой). Поэтому, если строка была получена из недоверенного источника - к ней нельзя применять ни один из этих методов.
Выходом в таком случае будет создание своего языка выражения как подмножества javascript, с последующим написанием своего парсера для него. Или же можно воспользоваться готовыми парсерами javascript, например esprima.
var x = 2,
y = "x*x";
alert( eval(y) );
Но eval
- это очень, очень плохо!
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/eval#dont-use-it
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Нужно сделать перебор в цикле используя 'map' и при этом вернуть результат выполнения 'map' используя при этом условие 'if'Но уменя при попытке...
Собственно запускаю setState при прокрутки мышью, начинает все тормозить, может даже "зависнуть" хром