Ответы:
С eval("my script here")
функцией.
Вы можете выполнить это с помощью функции. Пример:
var theInstructions = "alert('Hello World'); var x = 100";
var F=new Function (theInstructions);
return(F());
var F=function(){eval(theInstructions);};
?
new Function("alert('Hello World');")()
eval
Функция будет оценивать строку , которая передается ему.
Но использование eval
может быть опасным , поэтому используйте с осторожностью.
Редактировать: Аннаката имеет хорошее замечание - это не только eval
опасно , но и медленно . Это связано с тем, что анализируемый код должен быть проанализирован на месте, что потребует некоторых вычислительных ресурсов.
eval()
это опасно. Есть ли альтернатива?
Используйте eval ().
W3 Школьный тур по eval . На сайте есть несколько полезных примеров eval. Документация Mozilla подробно описывает это.
Вы вероятно получите много предупреждений об использовании этого безопасно. НЕ позволяйте пользователям вводить НИЧЕГО в eval (), так как это огромная проблема безопасности.
Вы также хотите знать, что eval () имеет другую область видимости .
eval
для меня лучше, чем та статья W3Schools. Что-то читаемое с хорошим объяснением и примерами будет developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… . И нет, я не бьорнинге
Попробуй это:
var script = "<script type='text/javascript'> content </script>";
//using jquery next
$('body').append(script);//incorporates and executes inmediatelly
Лично я не проверял это, но, кажется, работает.
Немного похоже на то, что сказал @Hossein Hajizadeh alerady, хотя более подробно:
Есть альтернатива eval()
.
Функция setTimeout()
предназначена для выполнения чего-либо после интервала в миллисекунды, и код, который должен быть выполнен, просто отформатирован в виде строки.
Это будет работать так:
ExecuteJavascriptString(); //Just for running it
function ExecuteJavascriptString()
{
var s = "alert('hello')";
setTimeout(s, 1);
}
1
означает, что он будет ждать 1 миллисекунду перед выполнением строки.
Возможно, это не самый правильный способ сделать это, но это работает.
setTimeout
? Обратите внимание, что в любом случае это сделает выполнение асинхронным. Это означает, что весь код, который следует за setTimeout
вызовом, будет вызван до того, как код будет передан setTimeout
(даже если вызван с 0 (ноль)).
Используйте eval, как показано ниже. Eval следует использовать с осторожностью, простой поиск « eval is evil » должен привести к появлению некоторых указателей.
function ExecuteJavascriptString()
{
var s = "alert('hello')";
eval(s);
}
Если вы хотите выполнить определенную команду (то есть строку) через определенное время - cmd = ваш код - InterVal = задержка для запуска
function ExecStr(cmd, InterVal) {
try {
setTimeout(function () {
var F = new Function(cmd);
return (F());
}, InterVal);
} catch (e) { }
}
//sample
ExecStr("alert(20)",500);
Val
в InterVal
заглавной?
Для пользователей, которые используют узел и которые связаны с контекстными последствиями eval()
предложений nodejs vm
. Он создает виртуальную машину V8, которая может изолировать выполнение вашего кода в отдельном контексте.
Если сделать шаг вперед, то vm2
ужесточается, vm
позволяя виртуальной машине запускать ненадежный код.
https://nodejs.org/api/vm.html - Официальный nodejs / vm
https://github.com/patriksimek/vm2 - расширенный vm2
const vm = require('vm');
const x = 1;
const sandbox = { x: 2 };
vm.createContext(sandbox); // Contextify the sandbox.
const code = 'x += 40; var y = 17;';
// `x` and `y` are global variables in the sandboxed environment.
// Initially, x has the value 2 because that is the value of sandbox.x.
vm.runInContext(code, sandbox);
console.log(sandbox.x); // 42
console.log(sandbox.y); // 17
console.log(x); // 1; y is not defined.
eval(s);
Но это может быть опасно, если вы принимаете данные от пользователей, хотя я полагаю, что если они сломают собственный браузер, это их проблема.
eval
с кодом от пользователей, который может, например, позволить пользователям красть учетные записи других пользователей без их ведома, просто загружая страницу.
Не уверен, что это обман или нет:
window.say = function(a) { alert(a); };
var a = "say('hello')";
var p = /^([^(]*)\('([^']*)'\).*$/; // ["say('hello')","say","hello"]
var fn = window[p.exec(a)[1]]; // get function reference by name
if( typeof(fn) === "function")
fn.apply(null, [p.exec(a)[2]]); // call it with params
Новая функция и apply () вместе работает
var a=new Function('alert(1);')
a.apply(null)
eval()
. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Я отвечал на аналогичный вопрос и получил еще одну идею, как этого добиться без использования eval()
:
const source = "alert('test')";
const el = document.createElement("script");
el.src = URL.createObjectURL(new Blob([source], { type: 'text/javascript' }));
document.head.appendChild(el);
В приведенном выше коде вы в основном создаете Blob, содержащий ваш скрипт, чтобы создать URL объекта (представление объекта File или Blob в памяти браузера). Поскольку у вас есть src
свойство для <script>
тега, скрипт будет выполняться так же, как если бы он был загружен с любого другого URL.
Эвал должен сделать это.
eval(s);
eval(s);
Помните, однако, что Eval очень мощный и довольно небезопасный. Лучше быть уверенным в том, что выполняемый скрипт является безопасным и неизменным для пользователей.
Можно использовать mathjs
Фрагмент сверху ссылки:
// evaluate expressions
math.evaluate('sqrt(3^2 + 4^2)') // 5
math.evaluate('sqrt(-4)') // 2i
math.evaluate('2 inch to cm') // 5.08 cm
math.evaluate('cos(45 deg)') // 0.7071067811865476
// provide a scope
let scope = {
a: 3,
b: 4
}
math.evaluate('a * b', scope) // 12
math.evaluate('c = 2.3 + 4.5', scope) // 6.8
scope.c
scope
это любой объект. Поэтому, если вы передадите глобальную область в функцию evalute, вы сможете динамически выполнять alert ().
Также mathjs - намного лучший вариант, чем eval (), потому что он работает в песочнице.
Пользователь может попытаться внедрить вредоносный код JavaScript через анализатор выражений. Парсер выражений mathjs предлагает изолированную среду для выполнения выражений, которая должна сделать это невозможным. Однако возможно, что существуют неизвестные уязвимости безопасности, поэтому важно соблюдать осторожность, особенно когда разрешается выполнение произвольных выражений на стороне сервера.
Более новые версии mathjs не используют eval () или Function ().
Парсер активно предотвращает доступ к внутреннему eval и новым функциям JavaScripts, которые являются основной причиной атак безопасности. Mathjs версии 4 и новее не использует eval-код JavaScript под капотом. Версия 3 и старше использовали eval для этапа компиляции. Это не является прямой проблемой безопасности, но приводит к большей возможной атаке.
Использование eval и создание новой функции для выполнения javascript сопряжено с множеством угроз безопасности.
const script = document.createElement("script");
const stringJquery = '$("#button").on("click", function() {console.log("hit")})';
script.text = stringJquery;
document.body.appendChild(script);
Я предпочитаю этот метод для выполнения Javascript, который я получаю в виде строки.