Выполнить код JavaScript, хранящийся в виде строки - PullRequest
147 голосов
/ 02 июня 2009

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

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

Ответы [ 18 ]

3 голосов
/ 02 июня 2009
eval(s);

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

2 голосов
/ 08 марта 2019

Для пользователей, которые используют узел и которые связаны с контекстными последствиями 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.
2 голосов
/ 05 февраля 2018

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

2 голосов
/ 30 января 2015

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

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
1 голос
/ 12 февраля 2018
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!');");
1 голос
/ 06 декабря 2016

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

var a=new Function('alert(1);')
a.apply(null)
1 голос
/ 02 июня 2009

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

eval(s);
0 голосов
/ 02 июня 2009
eval(s);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...