Выполнить код JavaScript, хранящийся в виде строки

Как мне выполнить JavaScript, который является строкой?

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    // how do I get a browser to alert('hello')?
}

23 ответа

Решение

С eval("my script here") функция.

Вы можете выполнить это с помощью функции. Пример:

var theInstructions = "alert('Hello World'); var x = 100";

var F=new Function (theInstructions);

return(F());

eval Функция будет оценивать строку, которая передается ей.

Но использование eval может быть опасным, поэтому используйте его с осторожностью.

Редактировать: аннаката имеет хорошее замечание - это не только eval опасно, это медленно. Это связано с тем, что анализируемый код должен быть проанализирован на месте, что потребует некоторых вычислительных ресурсов.

Для пользователей, которые используют узел и которые связаны с контекстными последствиями eval() nodejs предлагает vm, Он создает виртуальную машину V8, которая может изолировать выполнение вашего кода в отдельном контексте.

Делать вещи на шаг дальше vm2 который затвердевает vm позволяя виртуальной машине запускать ненадежный код.

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.

Попробуй это:

  var script = "<script type=\"text/javascript\"> content </script>";
  //using jquery next
  $('body').append(script);//incorporates and executes inmediatelly

Лично я не проверял это, но, кажется, работает.

Используйте eval().

W3 Школьный тур по eval. На сайте есть несколько полезных примеров eval. Документация Mozilla описывает это подробно.

Вы вероятно получите много предупреждений об использовании этого безопасно. НЕ позволяйте пользователям вводить НИЧЕГО в eval(), так как это серьезная проблема безопасности.

Вам также нужно знать, что eval() имеет другую область видимости.

new Function('alert("Hello")')();

Я думаю, что это лучший способ.

Немного похоже на то, что сказал @Hossein Hajizadeh alerady, хотя более подробно:

Есть альтернатива eval(),

Функция setTimeout() предназначен для выполнения чего-либо после интервала в миллисекунды, и код, который должен быть выполнен, просто отформатирован в виде строки.

Это будет работать так:

ExecuteJavascriptString(); //Just for running it

function ExecuteJavascriptString()
{
    var s = "alert('hello')";
    setTimeout(s, 1);
}

1 означает, что он будет ждать 1 миллисекунду перед выполнением строки.

Возможно, это не самый правильный способ сделать это, но это работает.

Проверено это на многих сложных и запутанных скриптах:

var js = "alert('Hello, World!');" // put your JS code here
var oScript = document.createElement("script");
var oScriptText = document.createTextNode(js);
oScript.appendChild(oScriptText);
document.body.appendChild(oScript);

Новая функция и apply() вместе работает также

var a=new Function('alert(1);')
a.apply(null)

Используйте 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);

Я отвечал на аналогичный вопрос и получил еще одну идею, как этого добиться без использования 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);

Но это может быть опасно, если вы принимаете данные от пользователей, хотя я полагаю, что если они сломают свой собственный браузер, это их проблема.

function executeScript(source) {
    var script = document.createElement("script");
    script.onload = script.onerror = function(){ this.remove(); };
    script.src = "data:text/plain;base64," + btoa(source);
    document.body.appendChild(script);
}

executeScript("alert('Hello, World!');");

Не уверен, что это обман или нет:

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

Эвал должен сделать это.

eval(s);

Можно использовать 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 и new Function JavaScripts, которые являются основной причиной атак на безопасность. Mathjs версии 4 и новее не использует eval в JavaScript. Версия 3 и более ранние использовали eval на этапе компиляции. Это не напрямую проблема безопасности, но приводит к увеличению вероятной поверхности атаки.

Этот метод избегает использования потенциально рискованного eval, предоставляет вызываемые функции, использует строгий режим в оценщике выражений для дополнительной надежности и менее подробен, чем другие ответы.

выполнить строковую команду

      function string_cmd(sCmd) {
    new Function(sCmd)();
}

оценить строковое выражение

      function string_exp(sCmd) {
    return Function(
        `'use strict'; 
        return (${sCmd})`
        )();
}

Применение:

      const result = string_exp("2+2");

string_cmd("alert(result)");

https://codepen.io/johnaweiss/pen/mdKpyZL

Использование eval и создание новой функции для выполнения javascript сопряжено с множеством рисков для безопасности.

const script = document.createElement("script");
const stringJquery = '$("#button").on("click", function() {console.log("hit")})';
script.text = stringJquery;
document.body.appendChild(script);

Я предпочитаю этот метод выполнять Javascript, который я получаю в виде строки.

eval(s);

Помните, однако, что Eval очень мощный и довольно небезопасный. Лучше быть уверенным в том, что выполняемый скрипт является безопасным и неизменным для пользователей.

Выполнить код, используя строку

Другие вопросы по тегам