Відповіді:
З 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.Документація Mozilla детально висвітлює це питання.
Ймовірно, ви отримаєте багато попереджень про безпечне використання. НЕ дозволяйте користувачам вводити будь-що в eval () оскільки це величезна проблема безпеки.
Ви також хочете знати, що eval () має іншу сферу застосування .
evalмені краще, ніж ця стаття W3Schools. Щось читабельне з хорошим поясненням та прикладами буде developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… . І немає, я не bjorninge
Спробуйте це:
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 - зло " повинен кинути деякі покажчики.
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дозволяючи 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
Нова функція та застосування () разом також працює
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-адреси об'єкта (представлення файлу або об'єкта Blob у пам'яті браузера). Оскільки у вас є srcвластивість <script>тегу, сценарій буде виконаний так само, як якщо б він був завантажений з будь-якої іншої URL-адреси.
eval повинен це зробити.
eval(s);
eval(s);
Пам'ятайте, що цей евал дуже потужний і досить небезпечний. Вам краще бути впевненим, що виконаний вами сценарій є безпечним та незмінним для користувачів.
Можна використовувати математику
Фрагмент зверху за посиланням:
// 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- будь-який об’єкт. Отже, якщо ви передасте глобальну область дії функції оцінки, можливо, ви зможете виконати попередження () динамічно.
Також 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, який я отримую як рядок.