Перевод строки в код

222
05 июля 2017, 00:38

У меня есть переменная y = "x*x", что нужно сделать чтобы превратить это в исполняемый код. То есть при вызове f(y) мне вместо f("x*x") подставлялось f(x*x)

Answer 1

Воспользуйтесь функцией eval:

f(eval(y));

Живой пример:

function f(number) { 
  console.log(number); 
} 
 
let x = 7; 
let y = "x*x"; 
f(eval(y));

Однако не стоит использовать eval без лишней необходимости, возможно стоит переписать код по другому.

Answer 2

Именно в таком виде вам подойдет ругаемый многими 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.

Answer 3
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

READ ALSO
Как в цикле map можно выполнить функцию?

Как в цикле map можно выполнить функцию?

Нужно сделать перебор в цикле используя 'map' и при этом вернуть результат выполнения 'map' используя при этом условие 'if'Но уменя при попытке...

204
Смена блока на странице по ссылке

Смена блока на странице по ссылке

Здравствуйте, у меня на лэндинге есть код

410
Тождественны ли конструкции?

Тождественны ли конструкции?

Тождественна ли конструкция:

224
setState at MouseWheel

setState at MouseWheel

Собственно запускаю setState при прокрутки мышью, начинает все тормозить, может даже "зависнуть" хром

196